Angular / دليل حلول تحريري

حل NG0203 خارج سياق الحقن

حدّد موضع inject والتقط الاعتمادية بسياق مدعوم وافصل عمر الحاقن من توقيت الرد غير المتزامن.

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

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يبلغ NG0203 عن وجوب استدعاء inject بسياق. يظهر بعد نقلها إلى ngOnInit أو حدث أو رد أو بعد await. قد يكون الرمز موفرًا صحيحًا؛ فالمشكلة السياق لا غياب المزود بالضرورة.

قد يختلف new المباشر في الاختبار من إنشاء Angular. لا يجعل الاسم أو المزخرف كل استدعاء لاحق سياقًا. احفظ المسار والمكدس الأصغر.

افهم الأسباب المحتملة

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

تحديد الاستدعاء غير المدعوم

يفترض المقطع LABEL صحيحة ويستدعي inject أثناء الحدث العادي. لا يجعل إنشاء المكوّن السابق المعالج سياق بناء. هو غير قابل للتشغيل ولا يُدّعى إعادة الخطأ بمتصفح. استخدم التصنيف الرسمي والمكدس بدل نقل مزودين غير مرتبطين.

typescript نداء حقن متأخر سياقي
onClick(): void {
  const label = inject(LABEL);
  console.log(label);
}

يحتاج الجسم صنفه ورمزه، ولا يملك حدثه العادي سياقًا تلقائيًا ولا يُنفّذ هنا.

الالتقاط مرة ثم الاستخدام لاحقًا

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

typescript بحث سياق مدعوم مكتمل ومعزول
import { InjectionToken, Injector, inject, runInInjectionContext } from "@angular/core";
const LABEL = new InjectionToken<string>("label");
const owner = Injector.create({ providers: [{ provide: LABEL, useValue: "ready" }] });
const label = runInInjectionContext(owner, () => inject(LABEL));
function later(): string { return label.toUpperCase(); }
console.log(later());
owner.destroy();
الناتج المتوقع
READY

يطبع READY قبل إتلاف الحاقن ويحل قيمة محلية دون تطبيق أو خدمة.

احترام عدم التزامن والنطاق

لا تضع inject بعد await وتفترض بقاء الإطار. التقط قبل التعليق وأدر العمر بالمالك. أبقِ خدمة الميزة بنطاقها ما لم تلزم المشاركة؛ فالجذر ليس إصلاح سياق. مرر DestroyRef الملتقطة خارج السياق الضمني واختبر الإتلاف مع التعليق كي لا يولد الإصلاح تسربًا.

تحقق من نجاح الإصلاح

ترجم البرنامج وشغّله وقارن READY. فعّل معالج المكوّن بعد التهيئة وافحص نطاق الاعتمادية الملتقطة، ولا تشغل الجسم الفاسد مستقلًا.

أضف استبدال الابن والرمز المفقود والتنظيف عند الحاجة. لا يثبت الحل عمر النسخة الصحيح؛ سجّل هل اختبرت DI أو الدورة أو المتصفح.

امنع تكرار المشكلة

  • قرّب نداء السياق من التهيئة وصدّر رمزًا واحدًا ووثّق ملكية الحاقن. راجع الردود وawait عند تعديل شيفرة الحقن.

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