Я ищу, чтобы обнаружить изменение маршрута в моем AppComponent
.
После этого я проверю глобальный токен пользователя, чтобы увидеть, вошел ли он в систему. Затем я могу перенаправить пользователя, если он не вошел в систему.
В Angular 2 вы можете subscribe
(событие Rx) к экземпляру Router. Так что вы можете делать такие вещи, как
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Изменить (начиная с rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Изменить 2 (с 2.0.0)
смотри также: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
я надеюсь, что может быть лучшеfilter
оператором RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Благодаря Peilonrayz (см. Комментарии ниже)
новый роутер> = RC.3
Вы также можете фильтровать по данному событию:
Использование
pairwise
оператора для получения предыдущего и текущего события также является хорошей идеей. https://github.com/angular/angular/issues/11268#issuecomment-244601977источник
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
ошибка в том, что в своем фрагменте фильтра вы подписываетесь на объект типа Event вместо NavigationEvent.Для Angular 7 кто-то должен написать так:
this.router.events.subscribe((event: Event) => {})
Подробный пример может быть следующим:
источник
Угловой 7 , если вы хотите ,
subscribe
чтобыrouter
источник
Угловой 4.x и выше:
Это может быть достигнуто с помощью свойства url класса ActivatedRoute, как показано ниже,
Примечание: что вам нужно импортировать и внедрить провайдера из
angular/router
пакетаа также
источник
Маршрутизатор 3.0.0-бета.2 должен быть
источник
В угловых 6 и RxJS6:
источник
import {Router, NavigationEnd} from "@angular/router"
Ответы здесь верны
router-deprecated
. Для последней версииrouter
:или
Чтобы увидеть разницу между ними, пожалуйста, проверьте этот вопрос .
редактировать
Для последней вы должны сделать:
источник
router
было обновлено снова (я еще не обновил свой ответ), поэтому я не уверен, как это для последних. За то, о чемrouter
я писал, ты не мог. @aknВ Angular 8 вы должны делать как
this.router.events.subscribe((event: Event) => {})
Пример:
источник
В компоненте вы можете попробовать это:
источник
источник
Расположение работает ...
источник
Выше большинство решений верны, но я сталкиваюсь с проблемой, которая вызывает многократное событие 'Navigation emit'. Когда я менял любой маршрут, это событие вызывается. Так что слушайте это полное решение для Angular 6.
источник
@Ludohen ответ отличный, но если вы не хотите использовать,
instanceof
используйте следующеетаким образом вы можете проверить текущее имя события в виде строки, а если событие произошло, вы можете делать то, что запланировали для вашей функции.
источник
Event
тип вызывает ошибку в Atom, поэтому я не использовал егоinstanceOf
чтобы ваш пример работал и в рабочем коде.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Я работаю с приложением angular5, и я сталкиваюсь с той же проблемой. когда я просматриваю угловую документацию, они предоставляют лучшее решение для обработки событий маршрутизатора. проверьте следующую документацию.
Маршрутизатор событий в Angular Маршрутные события в Angular5
Но специально для рассматриваемого случая нам нужно событие NavigationEnd
Угловое окончание навигации
Как это использовать?
Когда использовать это?
В моем случае у моего приложения есть общая панель инструментов для всех пользователей, таких как пользователи, администраторы, но мне нужно показать и скрыть некоторые параметры панели навигации в соответствии с типами пользователей.
Вот почему всякий раз, когда изменяется URL-адрес, мне нужно вызывать сервисный метод, который возвращает зарегистрированную информацию о пользователе в соответствии с ответом, который я буду использовать для дальнейших операций.
источник
Следующий ВИД работ и может сделать хитрый для вас.
К сожалению, это перенаправляет позже в процессе маршрутизации, чем я хотел бы.
onActivate()
Первоначального целевого компонента вызывается перед перенаправлением.На
@CanActivate
целевом компоненте можно использовать декоратор, но это а) не централизовано и б) не извлекает выгоду из внедренных сервисов.Было бы здорово, если бы кто-нибудь мог предложить лучший способ централизованной авторизации маршрута до его фиксации. Я уверен, что должен быть лучший способ.
Это мой текущий код (как бы я изменил его, чтобы прослушать изменение маршрута?):
источник
Я делаю это так с RC 5
источник
Просто внесите изменения в AppRoutingModule, как
источник
Angular 8. Проверьте, является ли текущий маршрут базовым .
источник
Я бы написал что-то вроде этого:
источник
простой ответ для Angular 8. *
источник