محتويات الدورة

Angular / المتوسط / الدرس 11

دورة الحياة وتنظيف الموارد

ضع التهيئة والتنظيف عند حدود الملكية الفعلية وتجنب تعديلًا أثناء العرض أو عملًا يعيش بعد إتلافه.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز البناء وتهيئة المدخل وجاهزية العرض والإتلاف.
  • استخدام DestroyRef وملكية تنظيف صريحة.
  • اختبار التأخر والتنظيف دون تسريب مؤقت أو مستمع.

لا يعني البناء جاهزية كل ما يعتمد عليه العرض

يبني Angular المكوّن ويعين المدخل ويفحص العرض ثم يتلفه. تعمل ngOnInit بعد البداية مرة وتستجيب ngOnChanges للتغير وتسبقها أولًا. تختلف جاهزية استعلام العرض والمدخل. فضّل الاشتقاق التفاعلي على نسخ القيم عبر خطافات كثيرة، ولا تخف عملًا مكلفًا بالمتكرر. تجنب التعديل وسط مرور العرض لفرض مرور آخر فقد يسبب عدم استقرار وخطأ التعبير بالتطوير.

فحص التنظيف بمالك محلي فعلي

ينشئ البرنامج حاقنًا ويطلب DestroyRef بسياق ويسجل تنظيفًا، فيضيف الإتلاف حدث الإغلاق. يفحص ذلك الملكية دون مكوّن أو مؤقت؛ فالعمر للمالك لا الكتلة النصية. قد يختلف مالك الخدمة من العرض الحالي فيهم نطاق المزود. قرّب الإعداد والتنظيف ليظهر المورد ووقت تحريره.

typescript فحص محلي مكتمل لرد الإتلاف
import { DestroyRef, Injector, inject, runInInjectionContext } from "@angular/core";
const owner = Injector.create({ providers: [] });
const events: string[] = [];
runInInjectionContext(owner, () => {
  inject(DestroyRef).onDestroy(() => events.push("closed"));
  events.push("created");
});
owner.destroy();
console.log(JSON.stringify(events));
الناتج المتوقع
["created","closed"]

التسلسل created ثم closed دون مستمع متصفح أو مؤقت أو تطبيق.

تمرير مالك الإتلاف عند غياب السياق الضمني

يلتقط المكوّن DestroyRef بالتهيئة ويمرره إلى takeUntilDestroyed في ngOnInit؛ فالخطاف ليس سياق حقن عامًا. المؤقت توضيحي ولا يبدأه المقرر. اضبط الوقت واختبر غياب التحديث بعد الإتلاف. قد ينظف التيار المحدود نفسه وتحتاج الاشتراكات والمستمعات والمراقبات الطويلة سياسة. لا تنتظر تحديث الصفحة للتنظيف.

typescript اشتراك سياقي بمالك تنظيف صريح
import { Component, DestroyRef, OnInit, inject, signal } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { interval } from "rxjs";
@Component({ selector: "app-tick-panel", standalone: true, template: `<p>{{ tick() }}</p>` })
export class TickPanel implements OnInit {
  readonly tick = signal(0);
  private readonly destroyRef = inject(DestroyRef);
  ngOnInit(): void {
    interval(1000).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => this.tick.set(value));
  }
}

يجب أن ترى التجربة المضبوطة نبضات أثناء حياة المالك فقط، ولا يُنفذ المقطع أو ينشئ مؤقتًا هنا.

تحتاج جاهزية DOM والإكمال غير المتزامن فحصين

استخدم رد العرض الموثق لعمل DOM بعد اكتماله لا قياسًا بالمنشئ. لها شروط سياق ومنصة ولا يعمل DOM الخاص بالمتصفح في الخادم. قد يصل async بعد الإتلاف أو تغير الكيان؛ اربط العمر واختر سياسة الأحدث. يفيد فحص destroyed للعمل المتأخر ولا يستبدل الإلغاء والملكية. تجنب مهلة عامة تخفي فرض دورة غير مفهوم.

اختبار الإتلاف كمسار عادي

اختبر مغادرة المسار والإزالة الشرطية والتكرار والإلغاء مع عمل معلق. عدّ تنظيف المستمع والاشتراك وامنع نتيجة القديم عن البديل. يثبت DestroyRef المحلي الرد ويثبت المكوّن دورة Angular المقصودة. لا تسجل الحساسية للتشخيص؛ أظهر فشل التحرير وحدد استعادته. يقلل التنظيف التسرب والقديم ويحفظ عقد الإلغاء دون ادعاء إسقاط عمل خادم مثبت.

الأخطاء الشائعة وإصلاحها

استدعاء inject في ngOnInit دون سياق.

لماذا يحدث؟
خُلطت جاهزية المدخل بتوافر سياق الحقن.
كيف تصلحه؟
التقط الاعتماديات عند التهيئة ومررها صراحة.
كيف تتجنب تكراره؟
اختبر فرضَي الدورة والحقن منفصلين.

مكوّن مزال يتلقى تحديث المؤقت.

لماذا يحدث؟
عاش المورد بعد مالكه المقصود.
كيف تصلحه؟
سجل التنظيف أو اربط الاشتراك بالمالك.
كيف تتجنب تكراره؟
اختبر الإتلاف مع التعليق.

مهلة تخفي خطأ تغير التعبير.

لماذا يحدث؟
يحدث التعديل بمرحلة عرض غير مناسبة.
كيف تصلحه؟
نمذج الاعتماد في تهيئة أو مسار تفاعلي صحيح.
كيف تتجنب تكراره؟
تجنب رقعة زمنية دون تفسير الدورة.

اختبر فهمك

1. سجّل ردَي تنظيف وأتلف المالك. ماذا يثبت الاختبار دون افتراض ترتيب غير موثق؟

اعرض الحل المشروح

افحص أثرَي التنظيف وعدم بقاء مورد، ولا تبنِ الصحة على ترتيب نسبي غير موثق. اجمع التنظيف المترابط بعملية مقصودة إن هم الترتيب، وقارن علامات المستقل كمجموعة مع فحص تحرير كل مورد.

2. تبدأ خدمة جذرية مؤقتًا لعرض قصير. لماذا قد لا يوقف إتلاف العرض المورد؟

اعرض الحل المشروح

تتبع الخدمة عمر الحاقن الجذري الأطول. اربط المورد بالمستهلك أو انقل الملكية للميزة أو أظهر اشتراكًا وإلغاءً. لا يعمل تنظيف الجذر كلما اختفى فرعي؛ اختبر مسار الملكية المختار.

أهم ما تعلمته

  • طابق الإعداد والتنظيف للمالك نفسه.
  • تختلف جاهزية المدخل والسياق وDOM.
  • افحص الإتلاف مع العمل المعلق.

المراجع الرسمية