“请添加@NgModule 注释”错误...在具有@NgModule 注释的内容上

问题描述

我找到了关于这个主题的其他帖子,但我的问题不一样。我可以通过关闭 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 (将#修改为@)