问题描述
我一直在玩SCAM(单组件角度模块)方法,但在将注入令牌从父模块传递到子模块时遇到了问题。
我有一个 ScamService 注入了 httpClient 和 baseUrl:
import { HttpClient,HttpClientModule } from '@angular/common/http';
import { Injectable,Inject,NgModule,ModuleWithProviders } from '@angular/core';
import { BASE_URL } from './injection.tokens';
@Injectable()
export class ScamService {
constructor( @Inject(BASE_URL) private baseUrl,private httpClient: HttpClient ) {}
public getData() {
return this.httpClient.get(`${this.baseUrl}/rest-of-endpoint`);
}
}
@NgModule({
imports: [HttpClientModule]
})
export class ScamServiceModule {
public static forRoot(baseUrl): ModuleWithProviders<ScamServiceModule> {
return {
ngModule: ScamServiceModule,providers: [{
provide: BASE_URL,useValue: baseUrl
}]
};
}
}
要向模块提供 BASE_URL 令牌,我需要创建返回 ModuleWithProviders 的静态方法。在那里我可以为令牌分配一个值。没关系。
接下来,我想在一个组件中使用该服务,所以我将ScamServiceModule导入到ScamComponentModule中:
import { Component,ModuleWithProviders,NgModule } from '@angular/core';
import { ScamService,ScamServiceModule } from './scam.service';
@Component({//...})
export class ScamComponent {
constructor(private scamService: ScamService) {}
}
@NgModule({
imports: [
ScamServiceModule.forRoot(
`The url I would like to pass is not in the environments,I need to take it from forRoot of ScamComponentModule`
)
]
})
export class ScamComponentModule {
public static forRoot(baseUrl): ModuleWithProviders<ScamComponentModule> {
// how to tell ScamServiceModule what the value of baseUrl is?
}
}
现在我需要为它提供基本网址。所以我应该调用 ScamServiceModule.forRoot('some-url')。如果我知道组件级别的网址就好了。
但是url需要通过ScamComponentModule的forRoot方法传递。
您对如何传递 baseUrl 有什么建议吗?
先谢谢你!
解决方法
该问题与 SCAM 方法无关。
这只是提供依赖关系。该问题的解决方案是在 Angular Providers 数组中使用 'deps' 属性以及 'provide' 和 'useValue'。