Альтернативный подход
Вместо использования LocationStrategy я бы посоветовал вам взглянуть на использование queryParams маршрута.Вы можете подписаться на них в ngOnInit
и отказаться от подписки в ngOnDestroy
.Похоже, что это будет хорошо работать в вашем случае, когда вы в основном пытаетесь вернуться к предыдущему состоянию в компоненте.
Например, пользователь может щелкнуть обратно отсюда:
localhost:4200 / # / table? FilterString = foo & colSort = idAscending
И в конечном итоге здесь:
localhost: 4200 / # / table? FilterString = foo
export class MyComponent implements OnInit, OnDestroy {
paramSub: Subscription;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.paramSub = this.route.queryParams.subscribe(params => {
console.log(params); // query params changed, getData()
})
}
ngOnDestroy(){
this.paramSub.unsubscribe();
}
}
ДополнительноДля угловых документов я нашел эту статью полезной для начала работы с QueryParams https://alligator.io/angular/query-parameters/
Extra
Проблема с LocationStrategy, как вы заметили, не предоставленаудалить слушателя.
Я не знаю достаточно, чтобы сказать, невозможно ли продолжать этот подход, но он, безусловно, более сложный.Вы можете попробовать использовать именованную функцию вместо анонимной функции, например, так:
constructor(private location: LocationStrategy) { }
ngOnInit() {
this.location.onPopState(this.popStateHandler);
}
popStateHandler(event){
console.log('handle onPopState', event);
}
Это похоже на шаг в правильном направлении, поскольку он решает проблему регистрации новой функции-обработчика каждый раз, когда вы инициализируетесоставная часть.Но тогда проблема заключается в том, что каждый раз, когда вы нажимаете назад, независимо от того, где вы находитесь в приложении, сработает функция обработчика.