Поставщик Angular не указан в AOT

Я хотел бы облегчить объявление провайдера, вызвав статическую функцию следующим образом:

const provider = MyModule.makeProvider();

@NgModule({
  bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
     ...
  ],
  providers: [
    provider,
    ...
  ],
})

но с AOT не получается (провайдер отсутствует)

Принимая во внимание, что это работает:

const providers = [{provide : myToken, useValue: "value"}];

@NgModule({
  bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
     ...
  ],
  providers: [
    provider,
    ...
  ],
})

person antoine    schedule 30.01.2018    source источник
comment
Возможный дубликат конфигурации динамического модуля/службы и AOT   -  person Bunyamin Coskuner    schedule 30.01.2018


Ответы (2)


Да, это потому, что все, что объявляет/использует модуль, должно быть статически проанализировано для работы AOT. См. это для получения дополнительной информации.

Что мы понимаем под статически анализируемым? Это означает, что другой программе не нужно запускать функцию, чтобы понять, каким может быть определенное значение, поскольку оно может быть выведено из самого кода. Вы не можете вывести какое-либо возвращаемое значение из функции из-за известной проблемы остановки.

Когда вы запускаете функцию для получения провайдеров, компилятор AOT будет сбит с толку. Это также относится к объявлениям динамических шаблонов/стиля css.

person Armen Vardanyan    schedule 30.01.2018

В качестве обходного пути я добавил статическую функцию в свой модуль. Эта функция возвращает ModuleWithProviders следующим образом:

import { NgModule, ModuleWithProviders } from '@angular/core';

// ....

public static withValue(value: string): ModuleWithProviders {
  return {
    ngModule: MyModule,
    providers: [
      { provide: MY_TOKEN, useValue: value},
    ],
};
person antoine    schedule 31.01.2018