问题描述
我找到了关于这个主题的其他帖子,但我的问题不一样。我可以通过关闭 AOT 编译来完全避免这个问题。
我使用的是 Angular 11。
在 Angular 11 之前的代码中,我有一些像这样定义的提供者:
providers: [
HighlighterService,SignInService,{ provide: AUTHENTICATOR,useClass: AuthenticationService },{ provide: NETWORK_ERROR_INTERCEPTOR_CONfig,useFactory: getNetworkErrorInterceptorConfig },{ provide: HTTP_INTERCEPTORS,useClass: UnauthorizednetworkInterceptor,multi: true },],
使用 Angular 11 中的 AOT,此提供程序设置失败:
装饰器不支持函数调用,但在 'AUTHENTICATOR' 中调用了 'InjectionToken'
@NgModule({
declarations: [
AppComponent...
],imports: [
browserModule...
MyOtherModule // <--- New problem crops up here
],bootstrap: [
AppComponent
]
})
export class AppModule {
static forRoot(): ModuleWithProviders<any> {
return {
ngModule: AppModule,providers: [
HighlighterService,};
}
}
然而,上述变化只是产生了一个新问题。我之前能够毫无困难地导入的模块现在产生了这个运行时错误:
错误:由模块“C:...中的AppModule”导入的意外值“C:/...中的MyOtherModule”。请添加@NgModule 注释。
但是 MyOtherModule
确实有 @NgModule
注释。一直都有,以前从来没有出现过任何关于 @NgModule
注释不存在的错误。
我唯一能想到的是,在类上执行 MyModule
注释之前,Angular 试图解析模块引用 @NgModule
的顺序。
如果这是问题,我不知道如何解决。
如果这不是问题,我对如何让我的代码与 AOT 一起正常工作更加困惑。
更新
我现在更好地理解了这个问题,但我仍然不知道该怎么办。
@NgModule
注释将此静态成员添加到模块类:
export class MyModule {
public static ngModuleDef = defineNgModule({
type: MyModule,imports: [...my imports...],declarations: [...my declarations...],bootstrap: [...my bootstrap component,if any...]
});
在Angular的代码库中,我找到了一个函数调用getNgModuleDef(moduleType)
的地方,如果没有找到模块定义,就会抛出上面关于缺少@NgModule注解的错误。
由此我可以得出结论,在注释有机会作用于 MyOtherModule
并注入这个静态 MyOtherModule
成员之前,ngModuleDef
正在被引用,因此我的模块没有被定义为有效模块。
这对我来说似乎是一个讨厌的 Catch-22。
有没有办法延迟我的主 AppModule
的实例化,直到我确定 MyOtherModule
已完全加载并由 @NgModule 定义?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)