Bu makaleyi okumanızı şiddetle tavsiye ediyorum:
Sağlayıcılarla modül
Bir modülü içe aktardığınızda, genellikle modül sınıfına bir başvuru kullanırsınız:
@NgModule({
providers: [AService]
})
export class A {}
-----------------------------------
@NgModule({
imports: [A]
})
export class B
Bu şekilde, modüle kayıtlı tüm sağlayıcılar A
kök enjektöre eklenecek ve tüm uygulama için kullanılabilir olacaktır.
Ancak bunun gibi sağlayıcılarla bir modül kaydetmenin başka bir yolu var:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProviders = {
ngModule: A,
providers: [AService]
};
----------------------
@NgModule({
imports: [moduleWithProviders]
})
export class B
Bu, öncekiyle aynı çıkarımlara sahiptir.
Muhtemelen tembel yüklü modüllerin kendi enjektörlerine sahip olduğunu biliyorsunuzdur. Öyleyse AService
, tüm uygulama için kullanılabilir olmak için kaydolmak istediğinizi , ancak bazılarının BService
yalnızca tembel yüklü modüller için mevcut olmasını istediğinizi varsayalım . Modülünüzü şu şekilde yeniden düzenleyebilirsiniz:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [AService]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [BService]
};
------------------------------------------
@NgModule({
imports: [moduleWithProvidersForRoot]
})
export class B
// lazy loaded module
@NgModule({
imports: [moduleWithProvidersForChild]
})
export class C
Artık BService
yalnızca yavaş yüklenen alt modüller AService
için geçerli olacak ve tüm uygulama için geçerli olacak.
Yukarıdakileri dışa aktarılan bir modül olarak şu şekilde yeniden yazabilirsiniz:
@NgModule({
providers: [AService]
})
class A {
forRoot() {
return {
ngModule: A,
providers: [AService]
}
}
forChild() {
return {
ngModule: A,
providers: [BService]
}
}
}
--------------------------------------
@NgModule({
imports: [A.forRoot()]
})
export class B
// lazy loaded module
@NgModule({
imports: [A.forChild()]
})
export class C
Bunun RouterModule ile ne ilgisi var?
Her ikisine de aynı jeton kullanılarak erişildiğini varsayalım:
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [{provide: token, useClass: AService}]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [{provide: token, useClass: BService}]
};
Ayrı yapılandırmalarla, token
tembel yüklü bir modülden talep ettiğinizde, BService
tam planlandığı gibi alacaksınız .
RouterModule, ROUTES
bir modüle özgü tüm yolları almak için belirteç kullanır . Geç yüklü modüle özgü yolların bu modül içinde mevcut olmasını istediğinden (BService analoglarımız), tembel yüklü alt modüller için farklı konfigürasyon kullanır:
static forChild(routes: Routes): ModuleWithProviders {
return {
ngModule: RouterModule,
providers: [{provide: ROUTES, multi: true, useValue: routes}]
};
}