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

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

المنصة

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

الحساب

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

روابط

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

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

صُنع بـ في مصر

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

منهج Angular

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

كل اللغات
مدرسة البرمجة/منهج Angular /استخدام وظيفة runInInjectionContext لتنفيذ الشيفرات خارج سياق الحقن المباشر

استخدام وظيفة runInInjectionContext لتنفيذ الشيفرات خارج سياق الحقن المباشر

runInInjectionContextInjection ContextEnvironmentInjectorAngular ArchitectureDI Scopes

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

1
وجه المقارنة المعماريةسياق الحقن المباشر (Direct Injection Context)استخدام `runInInjectionContext`
متى يعمل؟فقط أثناء دورة إنشاء العنصر أو الخدمة (قبل انتهاء الـ constructor)في أي وقت لاحق وأثناء أي عملية غير متزامنة أو حدث خارجي
مكان استدعاء `inject()`مباشرة بدون أي أدوات مساعدةيجب تغليف الكود بداخل دالة معتمرَّة وتمريرها إلى `runInInjectionContext`
الاعتمادية على المزود (`Injector`)يعتمد تلقائياً على المزود الحالي للمكون أو الخدمةيتطلب تمرير `EnvironmentInjector` أو `Injector` مرجعي يحدد مصدر الاعتماديات

الشرح

تُعد دالة inject() أداة جبارة لحقن الاعتماديات، لكنها مشروطة بالعمل حصرياً داخل سياق الحقن المباشر (Injection Context)؛ مثل دالة الإنشاء (constructor)، أو أثناء تهيئة المتغيرات في المكونات والخدمات. عندما تحتاج إلى حقن الاعتماديات في أماكن زمنية متأخرة خارج هذا السياق المباشر (مثل داخل الـ Callbacks، أو العمليات غير المتزامنة Async operations، أو الـ Resolvers)، تأتي دالة runInInjectionContext كحل معماري هندس

تفصيل فلسفة وعمل runInInjectionContext

كسر قيود التوقيت في حقن الاعتماديات (Breaking Temporal Constraints):

بشكل افتراضي، يغلق أنگولر سياق الحقن فور الانتهاء من بناء الصنف. عبر الاحتفاظ بمرجع لـ EnvironmentInjector واستخدامه مع runInInjectionContext, يمكنك استعادة هذا السياق في أي وقت تريده.

الاستخدامات المعمارية المتقدمة (Advanced Use Cases):

تُستخدم هذه التقنية بكثرة داخل الدوال الخدمية العامة (Utility Functions) التي تتطلب حقن اعتمادات معينة دون الحاجة لأن تكون مربوطة بصنف أو مكون محدد طوال الوقت.

أمثلة برمجية موسعة: ملفات وتنسيق متنوع للتوضيح العملي

المثال الأول: ملف الخدمة التي تستخدم runInInjectionContext لتنفيذ مهام لاحقة (context-bridge.service.ts)

typescript
1import { Injectable, EnvironmentInjector, runInInjectionContext, inject } from '@angular/core';
2
3@Injectable({
4 providedIn: 'root'
5})
6export class ContextBridgeService {
7 // حقن موزع البيئة والاحتفاظ بمرجع له للاستخدام المستقبلي
8 private readonly envInjector = inject(EnvironmentInjector);
9
10 executeOutsideContextLater(task: () => void): void {
11 // محاكاة عملية غير متزامنة (مثل setTimeout أو Observable)
12 setTimeout(() => {
13 // إعادة إنشاء سياق الحقن لتنفيذ شيفرة تتطلب inject() لاحقاً
14 runInInjectionContext(this.envInjector, () => {
15 task();
16 });
17 }, 1000);
18 }
19}

المثال الثاني: ملف المكون الذي يستهلك الخدمة وينفذ المهام المتأخرة (context-demo.component.ts)

typescript
1import { Component, inject, signal } from '@angular/core';
2import { CommonModule } from '@angular/common';
3import { ContextBridgeService } from './context-bridge.service';
4import { PlatformConfigService } from './platform-config.service';
5
6@Component({
7 selector: 'app-context-demo',
8 standalone: true,
9 imports: [CommonModule],
10 template: `
11 <div class="context-container">
12 <h3>لوحة اختبار runInInjectionContext</h3>
13 <p class="status-msg">حالة التنفيذ: <strong>{{ executionStatus() }}</strong></p>
14 <button (click)="triggerDeferredTask()" class="run-btn">تنفيذ مهمة متأخرة بسياق حقن</button>
15 </div>
16 `,
17 styles: [`
18 .context-container { background: #090d16; color: #fff; padding: 24px; border-radius: 12px; border: 1px solid #1e293b; }
19 .status-msg { background: #1e293b; padding: 12px; border-radius: 6px; color: #38bdf8; font-weight: bold; margin-bottom: 12px; }
20 .run-btn { background: #10b981; color: #090d16; border: none; padding: 8px 16px; border-radius: 6px; font-weight: bold; cursor: pointer; }
21 `]
22})
23export class ContextDemoComponent {
24 private readonly bridgeService = inject(ContextBridgeService);
25 readonly executionStatus = signal('في الانتظار...');
26
27 triggerDeferredTask() {
28 this.executionStatus.جارٍ التنفيذ...();
29
30 this.bridgeService.executeOutsideContextLater(() => {
31 // هنا تم استعادة سياق الحقن، ويمكننا استخدام inject() بأمان تام
32 const platformConfig = inject(PlatformConfigService);
33 const version = platformConfig.getAppVersion();
34
35 this.executionStatus.set(`تم التنفيذ بنجاح! إصدار المنصة المحقون: ${version}`);
36 });
37 }
38}

⚠️ تحذير

احذر من محاولة استدعاء inject() بدون توفير مرجع الـ Injector الصحيح! إذا حاولت استدعاء inject() في مكان لا يوجد فيه سياق حقن مباشر ولم تقم بتغليفه بـ runInInjectionContext مع تمرير Injector صالح، فسيهوي التطبيق مباشرة ويطلق خطأ فادحاً وقت التشغيل (NullInjectorError).

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

  • —استخدم runInInjectionContext بحذر وعِند الضرورة القصوى فقط!
  • —التصميم المعماري السليم في أنگولر يعتمد على إجراء عمليات الحقن مباشرة في نطاق الـ constructor أو عبر دالة inject() المباشرة. الجأ لهذه الدالة فقط عند التعامل مع العمليات غير المتزامنة تماماً والتي تستدعي حقن اعتمادات جديدة.

الدرس السابق

المعالجات والتنفيذات الوظيفية المتقدمة

الدرس التالي

مقدمة إلى النماذج المعتمدة على القوالب ومتى تستخدمها

نوفيل

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

المنصة

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

الحساب

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

روابط

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

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

صُنع بـ في مصر