0Pricing
Angular Academy · درس

الإشارات المحسوبة

اشتقّوا قيمًا تتحدّث تلقائيًا

الإشارات المحسوبة درس مجاني في Angular Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Angular Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Angular Academy 4 دروس في المجموع.

ما الإشارة المحسوبة

تشتق إشارة computed() قيمة من إشارة أخرى أو أكثر. كلما تغيرت إشارة مصدر، تُعاد حساب القيمة المحسوبة بتكاسل — أي فقط عندما يقرأها شيء ما.

الإشارات المحسوبة للقراءة فقط؛ فلا يمكنك استدعاء .set() عليها.

إنشاء إشارة محسوبة

مرّر دالة إلى computed(). ويتتبع Angular تلقائيًا كل إشارة تقرؤها داخلها.

import { signal, computed } from '@angular/core';

const price = signal(100);
const quantity = signal(2);

const total = computed(() => price() * quantity());

console.log(total()); // 200

التتبع التلقائي للتبعيات

لا تحتاج أبدًا إلى تعريف التبعيات يدويًا. تؤدي قراءة price() وquantity() داخل الدالة المستدعاة إلى تسجيلهما تلقائيًا كتبعيات.

إذا قُرئت إشارة بصورة شرطية ولم يُنفَّذ ذلك الفرع، فلن تُتتبَّع في ذلك التشغيل.

const showTax = signal(false);
const tax = signal(20);
const base = signal(100);

const final = computed(() =>
  showTax() ? base() + tax() : base()
);
// When showTax() is false, "tax" is NOT a dependency

التكاسل والتخزين المؤقت

لا تُشغَّل الإشارة المحسوبة إلا عند قراءتها، كما أنها تخزّن نتيجتها مؤقتًا. إذا قرأتها مرتين من دون تغير المصادر، تُشغَّل الدالة مرة واحدة.

const a = signal(1);
const doubled = computed(() => {
  console.log('recompute');
  return a() * 2;
});

doubled(); // logs "recompute", returns 2
doubled(); // cached, returns 2, no log

سَلسَلة الإشارات المحسوبة

يمكن أن تعتمد الإشارات المحسوبة على إشارات محسوبة أخرى، لتشكّل رسمًا بيانيًا تفاعليًا.

const firstName = signal('Ada');
const lastName = signal('Lovelace');

const fullName = computed(() => firstName() + ' ' + lastName());
const greeting = computed(() => 'Hello, ' + fullName());

console.log(greeting()); // Hello, Ada Lovelace

استخدام computed في مكوّن

تتألق الإشارات المحسوبة في المكوّنات. ولا يُعاد عرض القالب إلا عندما تتغير القيمة المحسوبة فعلًا.

import { Component, signal, computed } from '@angular/core';

@Component({
  selector: 'app-cart',
  template: '<p>Total: {{ total() }}</p>'
})
export class CartComponent {
  items = signal([10, 20, 30]);
  total = computed(() => this.items().reduce((a, b) => a + b, 0));
}

الإشارات المحسوبة للقراءة فقط

تؤدي محاولة تعيين قيمة لإشارة محسوبة إلى خطأ في وقت الترجمة. فهي موجودة للتعبير عن الحالة المشتقة فحسب.

const count = signal(0);
const doubled = computed(() => count() * 2);

// doubled.set(10); // ERROR: Property 'set' does not exist
count.set(5);       // OK - update the source instead
console.log(doubled()); // 10

المساواة وتخطي إعادة الحساب

تستخدم الإشارة المحسوبة Object.is للمقارنة افتراضيًا. إذا ساوت القيمة المحسوبة الجديدة القيمة القديمة، فلن تُخطر التبعيات، مما يتجنب العمل غير الضروري.

const value = signal(2);
const isEven = computed(() => value() % 2 === 0);

// value 2 -> 4 -> 6 all yield isEven() === true
// Dependents of isEven do NOT re-run on those changes

دالة مساواة مخصصة

يمكنك تمرير الخيار equal للتحكم في وقت اعتبار الإشارة المحسوبة متغيرة — وهذا مفيد للكائنات أو المصفوفات.

const data = signal({ id: 1, name: 'A' });

const view = computed(
  () => data(),
  { equal: (a, b) => a.id === b.id }
);
// Dependents re-run only when the id changes

تجنب الآثار الجانبية في computed

يجب أن تكون الإشارة المحسوبة نقية: من دون استدعاءات HTTP، أو تسجيل يُعد سلوكًا، أو تعديل لإشارات أخرى. تنتمي الآثار الجانبية إلى effect(). والحفاظ على نقاء الإشارة المحسوبة يجعل الرسم البياني التفاعلي قابلًا للتنبؤ.

الإشارات المحسوبة مقابل الدوال

تُشغَّل دالة القالب في كل دورة من دورات اكتشاف التغييرات. أما الإشارة المحسوبة فلا تُشغَّل إلا عند تغير تبعياتها، وتخزّن النتيجة مؤقتًا — وهذا أكثر كفاءة بكثير للقيم المشتقة.

// Method: recalculates every CD cycle
getTotal() { return this.items().reduce((a, b) => a + b, 0); }

// Computed: memoized, runs only on item change
total = computed(() => this.items().reduce((a, b) => a + b, 0));

تحقق سريع

اختبر مدى فهمك للإشارات المحسوبة.

مراجعة: الإشارات المحسوبة

تعلمت أن computed() تنشئ إشارات مشتقة للقراءة فقط مع التتبع التلقائي للتبعيات، والتقييم الكسول، والتخزين المؤقت.

  • حافظ على نقائها — من دون آثار جانبية.
  • يمكنها الاعتماد على إشارات محسوبة أخرى.
  • استخدم equal لاكتشاف التغييرات المخصص.

التالي: تشغيل الآثار الجانبية باستخدام effect().

الأسئلة الشائعة

هل درس «الإشارات المحسوبة» مجاني؟

نعم — نص درس «الإشارات المحسوبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Angular Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Angular Academy 4 دروس في المجموع.

ماذا ستتعلم في «الإشارات المحسوبة»؟

اشتقّوا قيمًا تتحدّث تلقائيًا تتمرن على Angular Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Angular Academy؟

لا تُشترط خبرة سابقة. Angular Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «الإشارات المحسوبة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Angular Academy هذا؟

نعم. كل درس في Angular Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الإشارات المحسوبة
  2. التأثيرات والآثار الجانبية
  3. تنظيف التأثيرات ودورة الحياة
  4. ‏linkedSignal والأنماط المتقدمة
← العودة إلى Angular Academy