نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
AN

منهج Angular

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج Angular /إيقاف آلية اكتشاف التغييرات يدوياً

إيقاف آلية اكتشاف التغييرات يدوياً

التحكم اليدويChangeDetectorRefإيقاف الكشفdetectChangesAngular 22.1

جدول مرجعي سريع

1
اسم الطريقة (Method)التأثير الهندسي على المكونمتى يتم استخدامها برمجياً
cdr.detach()فصل المكون كلياً عن شجرة اكتشاف التغييرات التلقائيةعند الرغبة في تجميد التحديثات تماماً لمنع أي فحص غير ضروري
cdr.detectChanges()تنفيذ دورة فحص وتحديث يدوية لمرة واحدة فقطعندما تتغير البيانات في الخلفية وتريد تحديث الواجهة فوراً دون انتظار الأحداث
cdr.reattach()إعادة ربط المكون بشجرة الفحص التلقائي مرة أخرىعند انتهاء العمليات المكثفة والعودة للعمل بالطريقة العادية
cdr.markForCheck()إعلام نظام OnPush بإجراء تحديث في دورة الفحص القادمةعند الرغبة في جدولة تحديث لمكون يعمل باستراتيجية OnPush

الشرح

نستكمل في هذا الدرس الرابع من الفصل السادس رحلة التحكم المتقدم بالأداء من خلال التعرف على كيفية إيقاف واستئناف آلية اكتشاف التغييرات يدوياً (Manual Change Detection Control) باستخدام الخدمة القوية ChangeDetectorRef في إصدار Angular 22.1. في بعض السيناريوهات الخاصة، مثل التعامل مع تدفقات بيانات ضخمة جداً أو مكتبات خارجية غير متزامنة تحدث تكرارات مستمرة، قد تحتاج إلى فصل المكون كلياً عن نظام الفحص التلقائي وتولي زمام الأمور برمجياً لرفع كفاءة الأداء إلى اقصى حد ممكن.

تفصيل فلسفة وعمل التحكم اليدوي في الكشف

فصل المكونات (Detaching Components):

عندما تستدعي this.cdr.detach() داخل المكون، فإن أنجولر يتجاهل هذا المكون وأبناءه تماماً أثناء دورات اكتشاف التغييرات، حتى وإن حدثت تفاعلات أو تغيرت متغيرات بداخله. هذا يمنع إعادة الرسم غير الضروري، مما يوفر طاقة المعالج بشكل هائل في الواجهات المعقدة.

التحديث اليدوي الموجه (Manual Triggers):

عندما يكون المكون مفصولاً، يمكنك استخدام this.cdr.detectChanges() لإجبار محرك أنجولر على فحص المكون وتحديث الواجهة يدوياً في اللحظة التي تريدها فقط، مما يمنحك تحكماً كاملاً ودقيقاً في دورة حياة بيانات التطبيق.

أمثلة برمجية: فصل المكون وإدارة التحديثات يدوياً

المثال الأول: مكون يقوم بفصل كشف التغييرات وتحديث الواجهة يدوياً بناءً على مؤقت

typescript
1import { Component, ChangeDetectorRef, inject, OnDestroy } from '@angular/core';
2
3@Component({
4 selector: 'app-manual-detection-demo',
5 standalone: true,
6 template: `
7 <div class="manual-box">
8 <h3>التحكم اليدوي باكتشاف التغييرات</h3>
9 <p>العداد المتزايد في الخلفية: <strong>{{ backgroundCounter }}</strong></p>
10
11 <button (click)="triggerManualCheck()">تحديث الواجهة يدوياً (detectChanges)</button>
12 <button (click)="toggleDetachState()">{{ isDetached ? 'إعادة الربط' : 'فصل الكشف' }}</button>
13 </div>
14 `
15})
16export class ManualDetectionDemoComponent implements OnDestroy {
17 backgroundCounter = 0;
18 isDetached = false;
19 private timerId: any;
20
21 // حقن مرجع كاشف التغييرات
22 private cdr = inject(ChangeDetectorRef);
23
24 constructor() {
25 // فصل المكون افتراضياً عند الإنشناء للاختبار
26 this.cdr.detach();
27 this.isDetached = true;
28
29 // زيادة العداد في الخلفية كل ثانية دون أن تتحدث الواجهة تلقائياً
30 this.timerId = setInterval(() => {
31 this.backgroundCounter++;
32 console.log('تغيرت القيمة في الخلفية إلى:', this.backgroundCounter);
33 }, 1000);
34 }
35
36 triggerManualCheck() {
37 // إجبار أنجولر على فحص وتحديث الواجهة بالقيم الحالية يدوياً
38 this.cdr.detectChanges();
39 }
40
41 toggleDetachState() {
42 if (this.isDetached) {
43 this.cdr.reattach();
44 this.isDetached = false;
45 console.تم(' إعادة ربط المكون بشجرة الكشف التلقائي.');
46 } else {
47 this.cdr.detach();
48 this.isDetached = true;
49 console.log(' تم فصل المكون عن شجرة الكشف.');
50 }
51 }
52
53 ngOnDestroy() {
54 clearInterval(this.timerId);
55 }
56}

أمثلة برمجية: جدولة التحديثات عبر markForCheck مع مكونات OnPush

المثال الثاني: استخدام markForCheck لتحديث مكون OnPush مفصول جزئياً

typescript
1import { Component, ChangeDetectionStrategy, ChangeDetectorRef, inject, signal } from '@angular/core';
2
3@Component({
4 selector: 'app-mark-for-check-demo',
5 standalone: true,
6 changeDetection: ChangeDetectionStrategy.OnPush,
7 template: `
8 <div class="box-mark">
9 <h4>مكون يعتمد على الجدولة اليدوية</h4>
10 <p>الوقت الحالي المسجل: <strong>{{ currentTime }}</strong></p>
11
12 <button (click)="updateTimeManually()">تحديث الوقت وجدولة الفحص</button>
13 </div>
14 `
15})
16export class MarkForCheckDemoComponent {
17 currentTime = new Date().toLocaleTimeString();
18 private cdr = inject(ChangeDetectorRef);
19
20 updateTimeManually() {
21 this.currentTime = new Date().toLocaleTimeString();
22
23 // إعلام محرك OnPush بضرورة فحص هذا المكون في دورة التحديث القادمة
24 this.cdr.markForCheck();
25 }
26}

نصائح احترافية

  • —استخدم التحكم اليدوي (detach و detectChanges) بحذر شديد وفي الأماكن الحرجة فقط!
  • —اللجوء لهذه التقنيات يكون مفيداً جداً عند التعامل مع تدفقات بيانات سريعة وكثيفة جداً (مثل الرسوم البيانية المتجددة أو بيانات الأسهم)، ولكن الاعتماد المفرط عليها قد يؤدي إلى صعوبة تتبع الأخطاء وتحديث الواجهات في حال نسيت استدعاء التحديث يدوياً.

الدرس السابق

استخدام استراتيجية OnPush لتحسين أداء المكونات

الدرس التالي

ربط البيانات مع المكونات الفرعية باستخدام الخصائص

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر