Вызов функции Angular 6 Prod не поддерживается в декораторах, но был вызван "..Module"
У меня есть эта ошибка при попытке использовать 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
У меня нет ошибки, но я не могу ввести структуры в атрибуте провайдеров
5 ответов
Это проблема с AOT, как говорит другой ответ. Функции, которые вызываются в декораторе, как @NgModule
должен быть подвержен статическому анализу компилятором. Точные реквизиты для этого сложны, поскольку они зависят от ряда факторов и версий используемых библиотек и инструментов.
Когда нарушающая функция находится в вашей библиотеке, есть место для действий. Например, в моем случае я решил удалить все локальные переменные из функции, сократив ее до одного оператора возврата сложного выражения без вызовов функций, кроме RouterModule.forRoot
который, как известно, работает. Посмотрите, например, коммит "make withConfig AOT совместимый" в проекте Angular Flex Layout. Играя с опциями углового компилятора в tsconfig.lib.json
также задокументировано, что некоторые комментаторы работают над проблемами GitHub в Angular.
В вашем случае, однако, похоже, что вы не контролируете модуль и функцию-нарушитель. Обязательно сообщите об этом разработчикам модуля.
У меня была такая же проблема при сборке с 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{}
Вот решение, которое я нашел . Замените import ранее определенной константой и импортируйте ее.
export const routerModule = RouterModule.forChild(routes);
У меня была похожая проблема, я исправил ее с помощью этого кода ниже.
// @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);
};
Это известная ошибка, вызванная AOT. Попробуйте использовать этот труд вместо JsonSchemaFormModule.forRoot
:
import {
JsonSchemaFormModule,
Framework,
NoFrameworkModule,
MaterialDesignFrameworkModule,
Bootstrap3FrameworkModule,
Bootstrap4FrameworkModule
} from 'angular2-json-schema-form';
@NgModule({
imports: [
....,
{
ngModule: JsonSchemaFormModule,
providers: [{
provide: Framework,
useClass: NoFrameworkModule,
multi: true
}, {
provide: Framework,
useClass: MaterialDesignFrameworkModule,
multi: true
}, {
provide: Framework,
useClass: Bootstrap3FrameworkModule,
multi: true
}, {
provide: Framework,
useClass: Bootstrap4FrameworkModule,
multi: true
}]
}
],
declarations: [...],
bootstrap: [DemoRootComponent]
})