#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
в качестве второго аргумента в вашу фабрику.