Я столкнулся с необъяснимым поведением компонента / страницы Ioni c Angular. Компонент используется как страница с боковой навигацией. Контекст более сложный, есть Google Map и другие сервисы, и проблема появляется после определенной последовательности действий (войти на страницу, выйти из страницы, войти в страницу, выполнить некоторые действия, выйти из страницы, войти в страницу -> дублированный вид?).
Я хотел бы узнать, как это возможно, что обратный вызов таймера возвращает текущий идентификатор (правильный), в то время как обратный вызов подписки возвращает текущий идентификатор И один из предыдущих Идентификаторы , как мне кажется, ошеломляют, поскольку нет никакой возможности, что подписчик может быть даже дважды инициализирован в одном и том же экземпляре (проверка нуля), и они отписываются в ngOnDestroy ().
ngOnInit(){
// get a new id from the service
this.viewId = this.idService.getViewId();
this.check();
this.watch();
}
check() {
console.log("init check");
if (!this.timerCheck) {
let timer1 = timer(0, 1000);
this.timerCheck = timer1.subscribe(() => {
// here everything looks normal on each page entry
// only the current viewId is shown
console.log("view id check: ", this.viewId, new Date().getTime());
});
}
}
watch(){
if (!this.locationSub) {
// the service returns a BehaviorSubject
this.locationSub = this.locationMonitor.getLocationObservable().subscribe((data) => {
if (data !== null) {
// here it happens that the previous viewId is shown
// even if the previous component instance has been destroyed (hopefully?)
console.log("view id watch: ", this.viewId, new Date().getTime());
}
});
}
}
ngOnDestroy(){
this.locationSub.unsubscribe();
this.timerCheck.unsubscribe();
}
[Update 1] Если я показываю viewId в html, он показывает правильный идентификатор, но когда, например, я нажимаю кнопку и вызываю функцию в компоненте, контекст неверен (this
указывает на предыдущий пример). Независимо от того, что может быть причиной этой ошибки, я нахожу, что это вызывает некоторые странные фундаментальные проблемы с Angular, такие как: как предыдущий экземпляр страницы может стать "зомби ie" и каким-то образом (кажется) "восстановленным из сборщика мусора "и слежка за текущим экземпляром.