ngOnDestroy والتنظيف
حرّروا الموارد عند إزالة المكوّن
ngOnDestroy والتنظيف درس مجاني في Angular Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Angular Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Angular Academy 4 دروس في المجموع.
لماذا يُعد التنظيف مهمًا؟
عند إزالة مكوّن من DOM، قد تتسبب الاشتراكات أو المؤقتات أو مستمعات الأحداث المتبقية في تسرّبات للذاكرة. وتُعد خطاف OnDestroy المكان الذي تنظف فيه هذه الموارد.
تطبيق OnDestroy
طبّق OnDestroy وأضف أسلوب ngOnDestroy. وستستدعيه Angular قبل إتلاف المكوّن مباشرةً.
import { Component, OnDestroy } from "@angular/core";
@Component({ selector: "app-demo", template: "" })
export class DemoComponent implements OnDestroy {
ngOnDestroy(): void {
console.log("cleaning up");
}
}إلغاء الاشتراك من Observables
يجب إلغاء الاشتراكات اليدوية لتجنب التسرّبات. خزّن Subscription واستدعِ unsubscribe في ngOnDestroy.
private sub!: Subscription;
ngOnInit() {
this.sub = this.timer$.subscribe(t => this.tick = t);
}
ngOnDestroy() {
this.sub.unsubscribe();
}إدارة الاشتراكات المتعددة
يمكنك جمع الاشتراكات في Subscription أب واحد، ثم إلغاء اشتراكها جميعًا دفعة واحدة.
private subs = new Subscription();
ngOnInit() {
this.subs.add(this.a$.subscribe());
this.subs.add(this.b$.subscribe());
}
ngOnDestroy() {
this.subs.unsubscribe();
}نمط takeUntil
يستخدم نمط شائع في RxJS Subject للإتلاف مع takeUntil، بحيث تكتمل التدفقات تلقائيًا عند انتهاء دورة حياة المكوّن.
private destroy$ = new Subject<void>();
ngOnInit() {
this.data$.pipe(takeUntil(this.destroy$))
.subscribe(d => this.data = d);
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}استخدام takeUntilDestroyed
توفر Angular الحديثة takeUntilDestroyed من @angular/core/rxjs-interop، وهي تربط التدفق بدورة حياة المكوّن من دون تنظيف يدوي.
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
constructor() {
this.data$.pipe(takeUntilDestroyed())
.subscribe(d => this.data = d);
}بديل Pipe المسماة async
يؤدي استخدام Pipe المسماة async في القالب إلى تجنب الاشتراكات اليدوية تمامًا، إذ تلغي الاشتراك تلقائيًا عند الإتلاف.
<p>{{ data$ | async }}</p>مسح المؤقتات والفواصل الزمنية
لا تدير Angular المؤقتات الأصلية. امسحها في ngOnDestroy لمنع تشغيل عمليات الاستدعاء بعد الإتلاف.
private id!: number;
ngOnInit() {
this.id = window.setInterval(() => this.tick(), 1000);
}
ngOnDestroy() {
clearInterval(this.id);
}إزالة مستمعات الأحداث
إذا أضفت مستمعات DOM يدويًا، فأزلها عند الإتلاف لمنع التسرّبات ومعالجات الأحداث القديمة.
private onScroll = () => this.handle();
ngOnInit() {
window.addEventListener("scroll", this.onScroll);
}
ngOnDestroy() {
window.removeEventListener("scroll", this.onScroll);
}استخدام DestroyRef مع عمليات الاستدعاء
يمكنك حقن DestroyRef وتسجيل عملية استدعاء onDestroy، وهو أمر مفيد في الخدمات أو السياقات غير التابعة للمكوّنات.
constructor(private destroyRef: DestroyRef) {
const id = setInterval(() => {}, 1000);
this.destroyRef.onDestroy(() => clearInterval(id));
}ما الذي يشغّل ngOnDestroy
يُنفَّذ ngOnDestroy عند إزالة المكوّن بواسطة التوجيه، أو بواسطة توجيه بنيوي مثل *ngIf، أو عند تدمير المكوّن الأب له.
تحقّق سريع
اختبر مدى فهمك لـ OnDestroy.
مراجعة
تعمل OnDestroy hook على تنظيف الاشتراكات والمؤقتات ومستمعي الأحداث. استخدم unsubscribe أو نمط takeUntil أو takeUntilDestroyed أو أنبوب async أو DestroyRef لمنع تسرّبات الذاكرة.
تعلم HTML مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 38
- الدروس
- 144
الأسئلة الشائعة
هل درس «ngOnDestroy والتنظيف» مجاني؟
نعم — نص درس «ngOnDestroy والتنظيف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Angular Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Angular Academy 4 دروس في المجموع.
ماذا ستتعلم في «ngOnDestroy والتنظيف»؟
حرّروا الموارد عند إزالة المكوّن تتمرن على Angular Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Angular Academy؟
لا تُشترط خبرة سابقة. Angular Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «ngOnDestroy والتنظيف»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Angular Academy هذا؟
نعم. كل درس في Angular Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ngOnInit والتهيئة
- ngOnChanges وتغييرات Input
- ngOnDestroy والتنظيف
- خطافا AfterView وAfterContent