Angular kengaytirilgan DI
Murakkab DI moslashuvchan konfiguratsiyalarni yaratish uchun ierarxik injektorlar, maxsus InjectionToken, ixtiyoriy va ko‘p provayderlar va funksiya uslubidagi inject() dan foydalanadi.
Kengaytirilgan DI Essentials
- Qo‘llanish doirasi: Ierarxik injektorlar ilova/marshrut/component darajasidagi provayderlar misollar yashaydigan joyni belgilaydi.
- Tokenlar:
InjectionTokendan classdan tashqari qiymatlar va konfiguratsiyalar uchun foydalaning. - Funksiya inject: konstruktorlar yoki yordamchi funksiyalarda
inject()dan foydalaning. - Majburiy emas va ko‘p: ixtiyoriy bog‘liqliklar va ko‘p provayderlar moslashuvchan kompozitsiyani faollashtiradi.
import { InjectionToken, inject, Optional } from '@angular/core';
// Tokens
export const CONFIG = new InjectionToken<{ api: string }>('CONFIG');
export const FEATURES = new InjectionToken<string[]>('FEATURES');
// Optional inject
const cfg = inject(CONFIG, { optional: true });
// Multi providers
bootstrapApplication(App, {
providers: [
{ provide: CONFIG, useValue: { api: '/api' } },
{ provide: FEATURES, useValue: 'search', multi: true },
{ provide: FEATURES, useValue: 'share', multi: true },
]
});
Kod tushuntirildi
- InjectionToken: Class bo‘lmagan qiymatlar va konfiguratsiya uchun yozilgan tokenni belgilaydi.
- inject(TOKEN, {ixtiyoriy: true }): Bog‘liqlikni oladi va yetishmayotganda
null/undefinedqaytaradi. - multi: true: bir xil token uchun bir nechta provayder qiymatlarini massivga to‘playdi.
Eslatmalar:
- Aloqador: Xizmatlar va DI, Router va App Bootstrap-ga qarang.
- Konfiguratsiya uchun
InjectionTokendan foydalaning, yordamchi dasturlarda funksiya uslubidagiinject()dan foydalaning va iloji bo‘lsa, yo‘nalishlar/componentlar uchun provayderlarni qamrab oling.
Kengaytirilgan DI misoli
Misol
import { bootstrapApplication } from '@angular/platform-browser';
import { Component, InjectionToken, inject } from '@angular/core';
const FEATURES = new InjectionToken<string[]>('FEATURES');
@Component({
selector: 'app-root',
standalone: true,
template: `
<h3>DI: Multi Providers</h3>
<p>Features: {{ features.join(', ') }}</p>
`
})
class App {
features = inject(FEATURES);
}
bootstrapApplication(App, {
providers: [
{ provide: FEATURES, useValue: 'search', multi: true },
{ provide: FEATURES, useValue: 'share', multi: true },
{ provide: FEATURES, useValue: 'ai', multi: true }
]
});
<app-root></app-root>
Misol tushuntirildi
- XUSUSIYATLAR tokeni: Provayderlar tomonidan kiritilgan stringlarni jamlovchi ko‘p provayder tokeni.
- inject(XUSUSIYATLAR): Ish vaqtida jamlangan massivni o‘qiydi.
- Displey: Shablon xususiyatlarni vergul bilan ajratilgan ro‘yxatga birlashtiradi.
Eslatmalar:
- Turlar bo‘yicha tokenlar:
InjectionTokendan classlar uchun emas, balki qiymatlar va interfeyslar uchun foydalaning. - Ko‘p provayderlar: Bitta token ostida ko‘plab hissalarni to‘plash uchun
multi: trueqo‘shing. - Scope provayderlari: Izolyatsiya kerak bo‘lganda root o‘rniga marshrutlarda/komponentlarda ta’minlashdan foydalaning.
Ixtiyoriy va ko‘p provayderlar
- Agar qaramlik talab qilinmasa,
@Optional()yokiinject(TOKEN, { optional: true })dan foydalaning. - Ko‘p provayderlar bir xil tokenga bir nechta qiymatlarni qo‘shishga imkon beradi.
import { InjectionToken, inject, Optional } from '@angular/core';
export const USER_NAME = new InjectionToken<string>('USER_NAME');
// Constructor optional
constructor(@Optional() public maybeName?: string) {}
// Function optional
const name = inject(USER_NAME, { optional: true });
Misol
import { bootstrapApplication } from '@angular/platform-browser';
import { Component, InjectionToken, inject } from '@angular/core';
const USER_NAME = new InjectionToken<string>('USER_NAME');
const FEATURES = new InjectionToken<string[]>('FEATURES');
@Component({
selector: 'app-root',
standalone: true,
template: `
<h3>Optional & Multi</h3>
<p>Hello: {{ name || 'Anonymous' }}</p>
<p>Features: {{ features?.join(', ') || '∅' }}</p>
`
})
class App {
name = inject(USER_NAME, { optional: true });
features = inject(FEATURES, { optional: true });
}
bootstrapApplication(App, {
providers: [
// Try commenting USER_NAME to see optional behavior
{ provide: USER_NAME, useValue: 'Dana' },
{ provide: FEATURES, useValue: 'search', multi: true },
{ provide: FEATURES, useValue: 'share', multi: true },
]
});
<app-root></app-root>
Misol tushuntirildi
- Ixtiyoriy in’ektsiya:
inject(USER_NAME, { optional: true })berilganda qiymatni qaytaradi yoki yo‘q bo‘lgandanull/undefined. - Ko‘p provayderlar: Bir nechta
FEATURESyozuvlar massivga birlashtirilgan. - Orqaga qaytishlar: ixtiyoriy qiymatlar yo‘q bo‘lganda shablon standart sozlamalarni ko‘rsatadi.
Eslatmalar:
- Ixtiyoriy deps: Agar qaramlik ixtiyoriy bo‘lsa, har doim
nullni ishlating. - To‘qnashuvlardan saqlaning: xususiyatlar bo‘ylab tasodifiy qayta foydalanishning oldini olish uchun tokenlarni aniq nomlang.
- Konfiguratsiya namunasi: global sozlamalarni tokenlar bilan modellashtiring va kerak bo‘lganda har bir marshrut/komponentni bekor qiling.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
