Я пытаюсь создать модуль NavigationModule, который можно использовать на лениво загруженных модулях с различными объектами навигации для каждого экземпляра модуля навигации. Я создал токен впрыска следующим образом и попытался использовать его в модуле:
export const NAVIGATION: InjectionToken<INavigationSettings> = new InjectionToken<INavigationSettings>('Navigation to display');
export class NavigationModule {
static withNavigation(navigation: INavigationSettings): ModuleWithProviders {
return {
ngModule: NavigationModule,
providers: [
{ provide: NAVIGATION, useValue: { value: navigation } }
],
}
}
}
Проблема в том, что всякий раз, когда я пытаюсь переопределить предоставленный токен впрыска в лениво загруженном модуле, вот так, он не оказывает такого двустороннего связывающего эффекта на значение в службе.
Я импортирую NavigationModule следующим образом:
@NgModule({
imports: [
NavigationModule.withNavigation(developerNavigation),
...
]
})
export class DeveloperModule { }
Я хочу внедрить указанную навигацию в сервис для дальнейшей обработки, однако она не поддерживает сервис в актуальном состоянии с последней указанной навигацией (в моем случае сервис является одиночным и использует providedIn: 'root'
) :
export class NavigationService {
constructor(@Optional() @Inject(NAVIGATION) public navigationList: INavigationSettings | null) {
}
}
Я что-то упустил? Как сделать так, чтобы служба обновляла внедренный навигационный список с импортированными модулями, загруженными позже? Это первый раз, когда я использую InjectionTokens, и бывает, что он мне нужен в модуле с отложенной загрузкой, что делает его сложным для меня.
Дополнительные сведения:
Удаление декоратора @Optional()
из службы дает мне
ошибка No provider for InjectionToken Navigation to display!
Я попытался предоставить NavigationService в NavigationModule
вместо этого, однако, это не без странного поведения.
навигация от разных ленивых загружается, однако это
похоже, что сервисы создаются несколько раз. Я стараюсь
избегайте нескольких экземпляров NavigationService.
Я попытался внедрить токен в компонент вместо службы, и это
Вроде хорошо работает, но было бы неплохо, если бы сервис первым получил доступ к навигации.