假设我们有一个模块可以在其中执行一些身份验证。
我想在将模块添加到项目时设置一些变量。
我已经看到路由模块使用函数forRoot(routes)
执行类似操作。
所以我尝试了同样但感觉不正确。
我的身份验证模块(应该是可配置的)
@NgModule({
imports: [
CommonModule
],
declarations: [],
providers: []
})
export class AuthenticationModule {
static forRoot(authMode: AuthMode) {
return {
ngModule: AuthenticationModule,
providers: [
{
useValue: authMode,
provide: AuthMode
},
{
provide: AuthenticationGuard,
useFactory: authFactory,
deps: [AuthMode, Router]
}
]
}
}
}
export function authFactory(authMode: AuthMode, router: Router) {
return new AuthenticationGuard(authMode, router);
}
AuthMode只是一个enum
保存值,以便稍后在AuthenticationGuard
中比较所选模式。
我的app.module.ts
添加了这样的模块:
@NgModule({
declarations: [ // some stuff ]
imports: [
BrowserModule,
// ... some other stuff
AuthenticationModule.forRoot(AuthMode.OAuthLocalStorage)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}
AuthenticationGuard
按这样的值注入authMode
:
@Injectable()
export class AuthenticationGuard implements CanActivate {
public storage: Storage;
constructor(@Inject(AuthMode) authMode, private router: Router) {
console.log('selected authMode is ', AuthMode[authMode]);
}
使用具有路由和canActivate
属性的后卫时,此方法正常。但是一旦我将它注入其他服务(在另一个模块中),我就会收到此错误:
错误:NgModule' AuthenticationModule'无效的提供商 - 只允许Provider和Type的实例,得到:[?undefined?,...]在SyntaxError.ZoneAwareError
所以我的基本问题是:
使用Angular 2和angular-cli(beta 25)构建
答案 0 :(得分:0)
如何将设置存储在特殊变量中并使用工厂注入它?
ToolbarItem