Угловые вызовы 6 Prod Function не поддерживаются в декораторах, но '..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у меня нет ошибки, но я не могу вставлять фреймворки в атрибут провайдеров

javascript,angular,typescript,angular6,angular2-aot,

1

Ответов: 2


0

Это известная ошибка, вызванная AOT. Попробуйте использовать этот workarourd вместо 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]
})

0

Это проблема с AOT, как говорит другой ответ.

В качестве обходного пути вы можете сохранить результат вызова forRoot в статическом поле и вместо этого ссылаться:

@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,
    MyNgModule.jsonSchemaForm //<-- here
  ],
  bootstrap: [ DemoRootComponent ]
})
export class MyNgModule {
  static jsonSchemaForm = JsonSchemaFormModule.forRoot(
    NoFrameworkModule, MaterialDesignFrameworkModule, Bootstrap3FrameworkModule,
    Bootstrap4FrameworkModule);
}
JavaScript, угловые, машинопись, angular6, angular2-АОТ,
Похожие вопросы