装饰器不支持Angular 6 Prod函数调用,但调用了“..Module”

问题描述 投票:2回答:1

尝试使用angular2-json-schema-form和build in prod时出现此错误

在“DemoModule”的模板编译期间出现错误错误在装饰器中不支持函数调用,但调用了“JsonSchemaFormModule”。我发现错误来自:

@NgModule({
  declarations: [ AceEditorDirective, DemoComponent, DemoRootComponent ],
  imports: [
    BrowserModule, BrowserAnimationsModule, FlexLayoutModule, FormsModule,
    HttpClientModule, MatButtonModule, MatCardModule, MatCheckboxModule,
    MatIconModule, MatMenuModule, MatSelectModule, MatToolbarModule,
    RouterModule.forRoot(routes),

    NoFrameworkModule, MaterialDesignFrameworkModule,
    Bootstrap3FrameworkModule, Bootstrap4FrameworkModule,

    JsonSchemaFormModule.forRoot(   // the source of the Error
      NoFrameworkModule,
      MaterialDesignFrameworkModule,
      Bootstrap3FrameworkModule,
      Bootstrap4FrameworkModule
    )
  ],
  bootstrap: [ DemoRootComponent ]
}) 

在库的源代码中,他们使用这样的东西:

export class JsonSchemaFormModule {
  static forRoot(...frameworks): ModuleWithProviders {
    const loadFrameworks = frameworks.length ?
      frameworks.map(framework => framework.forRoot().providers[0]) :
      [{ provide: Framework, useClass: NoFramework, multi: true }];
    return {
      ngModule: JsonSchemaFormModule,
      providers: [
        JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService,
        ...loadFrameworks
      ]
    };
  }
}

当我删除变量loadFramworks我没有错误但我似乎无法在providers属性中注入框架

javascript angular typescript angular6 angular2-aot
1个回答
3
投票

正如另一个答案所说,这是AOT的一个问题。在像@NgModule这样的装饰器中调用的函数必须适合编译器进行静态分析。对此的确切要求是棘手的,因为它们取决于所使用的库和工具的许多因素和版本。

当违规功能在您拥有的库中时,就有行动的余地。在我的例子中,例如,我决定从函数中删除所有局部变量,将其减少为复杂表达式的单个return语句,除了已知有效的RouterModule.forRoot之外没有函数调用。请参阅Angular Flex Layout项目中的the commit "make withConfig AOT compatible"示例。使用tsconfig.lib.json中的角度编译器选项也记录了一些评论者对Angular的GitHub问题的工作。

但是,在您的情况下,您似乎无法控制有问题的模块和功能。你一定要把它报告给模块的开发人员。

© www.soinside.com 2019 - 2024. All rights reserved.