#angular #typescript #rxjs #observable #ngrx
Вопрос:
У меня проблемы с проблемой, которую я не могу решить:
onSelectCompany() {
combineLatest([this.idCompany$, this.idUser$, this.router.events]).subscribe(res => {
if(res[2] instanceOf NavigationEnd){
this.router.navigateByUrl(`get-info/${res[0]/res[1]`)
}
})
}
и я вызываю эту функцию на ngOnInit моего компонента, у меня есть два наблюдаемых объекта, которые мне нужны, как параметры моего URL-адреса, и мне нужно перемещаться по этому URL-адресу, только если я не обновил страницу. Но функция, которую я пишу, не работает, у меня нет ошибки, но при отладке выполнение не входит в подписку. Почему?
Комментарии:
1. все 3 должны что-то испускать после выполнения этой функции
2. вместо этого нет, если я удалю этот.маршрутизатор.события, это сработает… проблема в маршрутизаторе.наблюдаемые события… Я не могу понять, почему
3. да, потому что router.events будет выдавать что-то только при наличии события маршрутизации
4. итак, я не могу использовать combineLatest в этом случае
5. Я обновил свой ответ «решением».
Ответ №1:
Все 3 наблюдаемых объекта должны что-то испускать после выполнения этой функции.
Источник: https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest
Be aware that combineLatest will not emit an initial value
until each observable emits at least one value.
1 решением может быть перемещение функции с ngOnInit
уровня поля или в конструктор
Ответ №2:
Возможно, вы можете обойти его, используя startWith
оператора для имитации события маршрутизатора. И вам также было бы проще, если бы вы разрушили combineLatest
результат, вместо того чтобы обращаться к нему с помощью индексов.
onSelectCompany() {
const helper$ = this.router.events.pipe(startWith(null)); // or some other 'safe' value
combineLatest([this.idCompany$, this.idUser$, helper$])
.subscribe(([ companyId, userId, routerEvent ]) => {
// destructure the res array and access the values with variable names
if(routerEvent instanceOf NavigationEnd){
this.router.navigateByUrl(`get-info/${companyId}/${userId}`)
}
})
}