Переопределение предоставленного токена инъекции в Angular 6 не работает - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь создать модуль 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.

  • Я попытался внедрить токен в компонент вместо службы, и это Вроде хорошо работает, но было бы неплохо, если бы сервис первым получил доступ к навигации.

...