Блокировка ввода на фабрике Angular APP_INITIALIZER

#angular #typescript #dependency-injection

#angular #typescript #внедрение зависимостей

Вопрос:

Я пытаюсь создать APP_INITIALIZER в своем приложении Angular 10, где фабрика имеет несколько зависимостей. Одна зависимость — это an InjectionToken<string> , но я не могу вводить ее так, как я делаю с конструкторами. Я получаю:

Ошибка в …
Декораторы здесь недопустимы.

Вот как воспроизвести это поведение (см. Также Этот пример StackBlitz):

 export const FOOBAR = new InjectionToken<string>('FOOBAR');

@Injectable({providedIn: 'root'})
export class FooService { dummy = 'value'; }

function initializerFactory(
  fooService: FooService,
  @Inject(FOOBAR) fooBar: string,
) {
  return () => {
    fooService.dummy = `Changed ${fooService.dummy}, added ${fooBar}`;
  }
}
 

И затем это в app.module :

 providers: [
  { provide: FOOBAR, useValue: 'token value' },
  { provide: APP_INITIALIZER, useFactory: initializerFactory, multi: true, deps: [FooService, FOOBAR] },
],
 

Как я могу Inject вставить токен в фабричный метод с помощью Angular?

Ответ №1:

Просто удалите @Inject(...) . Они deps вводятся «волшебным образом» в точном порядке, в котором вы их перечисляете, в качестве аргументов функции.

Итак, это:

  {
      provide: APP_INITIALIZER,
      useFactory: initializerFactory,
      multi: true,
      deps: [FooService, FOOBAR]
 },
 

введет FooService в качестве первого аргумента и FOOBAR в качестве второго аргумента в вашу фабрику.