假设我们有一个模块在里面做一些认证工作。
我想在将模块添加到项目时设置一些变量。
我已经看到路由模块与 function 做了类似的事情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
by 值:
@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?, ...] at SyntaxError.ZoneAwareError
所以我的基本问题是:
- 这是如何使 ngModule可配置的方式吗
- 什么可以解决上述问题?
使用 Angular 2 和 angular-cli (beta 25) 构建