3

假设我们有一个模块在里面做一些认证工作。

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

我已经看到路由模块与 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注入authModeby 值:

@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) 构建

4

1 回答 1

0

将设置存储在特殊变量中并使用工厂注入它怎么样?

let authModeSetting: AuthMode;

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

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

    return AuthenticationModule;
  }

}
于 2017-02-02T08:37:26.540 回答