23. المُزودون (Providers) وتحديد النطاق (Scoping)
يخبر المُزودون Angular بكيفية إنشاء مثيل لتبعية ما. ويحدد النطاق (Scoping) مكان توفر هذا المثيل ومدة بقائه.
مواقع تهيئة المُزود
-
الجذر (Root / Singleton): باستخدام
providedIn: 'root'في مُزخرف الخدمة. تكون الخدمة متاحة في كل مكان وهي فردية حقيقية. -
نطاق الوحدة (Module Scope): إدراج الخدمة في مصفوفة
providersلوحدة NgModule محددة (على سبيل المثال،AppModule). يتم تحديد نطاق الخدمة لجميع المكونات المُعلَن عنها داخل تلك الوحدة أو الوحدات التي تستوردها. -
نطاق المكون (Component Scope): إدراج الخدمة في مصفوفة
providersللبيانات الوصفية لمكون محدد (@Component).
سلوك نطاق المكون
عندما يتم توفير خدمة على مستوى المكون، يقوم Angular بإنشاء مثيل جديد لذلك المكون المحدد وجميع أطفاله. إذا تم تدمير المكون، يتم تدمير مثيل الخدمة أيضاً. وهذا يخلق مثيلات متعددة ومستقلة للخدمة.
مثال على خدمة محددة النطاق بالمكون:
typescript import { CounterService } from './counter.service';
@Component({ selector: 'app-component-scoped', templateUrl: './component-scoped.component.html', providers: [CounterService] // مثيل جديد لهذا المكون والأطفال }) export class ComponentScopedComponent { // ... constructor injection }
متى تستخدم أي نطاق؟
- الجذر (Root): للحالة العامة (global state)، والتسجيل (logging)، والتهيئة، وخدمات جلب البيانات (الأكثر شيوعاً).
- الوحدة (Module): للتبعيات الخاصة بالميزات (على سبيل المثال، توفير أدوات تحقق متخصصة للنماذج الخاصة بوحدة 'Settings' فقط).
- المكون (Component): للخدمات المؤقتة أو المعزولة (على سبيل المثال، خدمة لإدارة حالة نافذة مشروطة (modal) واحدة ومعقدة).