尝试使用angular2-json-schema-form并在产品中构建时出现此错误
在“ 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属性中注入框架
答案 0 :(得分:3)
另一个答案说这是AOT的问题。在诸如@NgModule
之类的装饰器中调用的函数必须能够接受编译器的静态分析。确切的要求很棘手,因为它们取决于使用的库和工具的多种因素和版本。
当您所拥有的库中有违规功能时,就有采取行动的余地。例如,以我为例,我决定从函数中删除所有局部变量,将其简化为一个复杂表达式的单个return语句,除了已知的RouterModule.forRoot
以外,没有其他函数调用。例如,参见Angular Flex Layout项目中的the commit "make withConfig AOT compatible"。一些评论者还记录了在tsconfig.lib.json
中使用Angular编译器选项的情况,以解决Angular的GitHub问题。
但是,就您而言,似乎您无法控制有问题的模块和功能。您绝对应该将其报告给模块的开发人员。
答案 1 :(得分:1)
使用aot = true构建时,我遇到了同样的问题。首先,您必须加载Bootstrap4FrameworkModule模块。
我找到的解决方法:
import { JsonSchemaFormModule, Bootstrap4FrameworkModule, JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService } from 'angular2-json-schema-form';
@NgModule({
declarations: [
testComponent
],
import:[
testRoutingModule,
Bootstrap4FrameworkModule.forRoot(), {
ngModule: JsonSchemaFormModule,
providers: [
JsonSchemaFormService, FrameworkLibraryService,
WidgetLibraryService,
]
}
}),
export class testModule{}
答案 2 :(得分:0)
我有类似的问题,我在下面的代码中修复了它。
// @dynamic
@NgModule({
declarations: [],
imports: [
CommonModule,
MatSnackBarModule
]
})
export class VrWidgetsModalModule {
static forRoot(durationTime: number, position: VrWidgetsModalPositionEnum): ModuleWithProviders {
return {
ngModule: VrWidgetsModalModule,
providers: [
{provide: VrWidgetsModalService, useFactory: modalFactory, deps: [MatSnackBar, 'DURATION_TIME', 'POSITION']},
{provide: 'DURATION_TIME', useValue: durationTime},
{provide: 'POSITION', useValue: position}
]
};
}
}
export const modalFactory = (modal: MatSnackBar, durationTime: number, modalPosition: VrWidgetsModalPositionEnum) => {
return new VrWidgetsModalService(modal, durationTime, modalPosition);
};