gpt4 book ai didi

angular - 如何使 angular2 模块 (ngModule) 可配置

转载 作者:太空狗 更新时间:2023-10-29 19:34:51 25 4
gpt4 key购买 nike

假设我们有一个模块在其中执行一些身份验证工作。

我想在将模块添加到项目时设置一些变量。

我已经看到路由模块使用函数 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 只是一个枚举,包含一个值,用于稍后在 AuthenticationGuard 中比较所选模式。

我的 app.module.ts 添加了这样的模块:

@NgModule({
declarations: [ // some stuff ]
imports: [
BrowserModule,
// ... some other stuff
AuthenticationModule.forRoot(AuthMode.OAuthLocalStorage)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}

AuthenticationGuard 按如下值注入(inject) 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 属性一起使用时工作正常。但是一旦我将它注入(inject)其他服务(在另一个模块内),我就会收到这个错误:

错误:NgModule“AuthenticationModule”的提供者无效 - 仅允许提供者和类型的实例,得到:[?undefined?, ...] at SyntaxError.ZoneAwareError

所以我的基本问题是:

  • 这是如何制作一个 ngModule 可配置的方法吗
  • 什么可以解决上述问题?

使用 Angular 2 和 angular-cli (beta 25) 构建

最佳答案

如何将设置存储在特殊变量中并使用工厂注入(inject)它?

let authModeSetting: AuthMode;

@NgModule({
imports: [
CommonModule
],
providers: [
{
useFactory: () => authModeSetting,
provide: AuthMode
},
AuthenticationGuard
]
})
export class AuthenticationModule {

static forRoot(authMode: AuthMode) {
authModeSetting = authMode;

return AuthenticationModule;
}

}

关于angular - 如何使 angular2 模块 (ngModule) 可配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com