#angular #router #preventdefault
#angular #маршрутизатор #preventdefault
Вопрос:
В моем компоненте приложения я проверяю, есть ли какие-либо открытые модальности при изменении маршрута. В этом случае я хочу
- закройте открытые модальности
- запретить изменение маршрута, потому что для пользователя закрытие модального уже является изменением маршрута…
Мне удалось закрыть модалы, если один открыт, но я не могу найти способ использовать что-то вроде ‘event.preventDefault ()’
export class AppComponent implements OnInit, OnDestroy {
private routerEventSubscription : Subscription;
constructor (
private router: Router,
private modalService: NgbModal
) { }
ngOnInit(): void {
this.routerEventSubscription = this.router.events.pipe(
filter( event => event instanceof NavigationStart ),
pairwise()
).subscribe( event => {
console.log(event);
if (this.modalService.hasOpenModals()) {
this.modalService.dismissAll();
/*** ==> Here I want to prevent the route from changing <== ***/
}
})
}
ngOnDestroy () {
this.routerEventSubscription.unsubscribe();
}
}
Ответ №1:
События маршрутизатора не помогут вам предотвратить навигацию, поскольку они просто позволяют вам узнать, что происходит, для предотвращения выхода пользователя из текущего маршрута, в котором он находится, вам необходимо использовать canDeactivate
свойство routes .
Вы можете ознакомиться с официальной документацией здесь: https://angular.io/api/router/CanDeactivate
И вы можете найти примеры / объяснения в Интернете, подобные этому: https://www.concretepage.com/angular-2/angular-candeactivate-guard-example
По сути, вы создаете защиту, которая реализует CanDeactivate
интерфейс, и назначаете эту защиту всем маршрутам в вашем приложении, которые вы хотите, чтобы пользователь оставил, и реализуете необходимую логику в самой защите (вы получаете текущий компонент и можете использовать его для реализации своей логики, или вы даже можете игнорировать его и использоватькакая-нибудь общая служба или все, что вы хотите).
Комментарии:
1. Это действительно вариант. Но я надеялся, что есть более общее решение, которое применяется ко всем маршрутам без необходимости добавлять защиту к каждому маршруту…
2. Да, я понимаю. Но я думаю, вам нужно настроить маршруты, чтобы сообщить Angular, как себя вести, и я не думаю, что это можно сделать на уровне модуля, поскольку вы обычно не хотите реализовывать то же самое для всех маршрутизаторов, я думаю. В любом случае я этого не пробовал, но я бы предположил, что
CanDeactivate
применение к маршруту также применяется ко всем его дочерним элементам, поэтому, если вы поместите все свои маршруты в качестве дочерних элементов приложения, вы можете установитьcanDeactivate
только этот параметр. Я думаю, что это сработало бы, но я не могу быть уверен на 100%, поскольку я не пробовал, может быть, стоит попробовать, если хотите 🙂