如何检测 Angular 中的路线改变?
2015-11-04
755045
我希望检测我的
AppComponent
中的路线变化。
此后,我将检查全局用户令牌以查看用户是否已登录,以便在用户未登录时可以重定向用户。
3个回答
在 Angular 2 中,您可以
订阅
(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.0.0 起:
另请参阅: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
Ludohen
2015-11-05
RxJS 6
router.events.pipe(filter(event => event instanceof NavigationStart))
感谢 Peilonrayz(见下面的评论)
新路由器 >= RC.3
import { Router, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RoutesRecognized } from '@angular/router';
constructor(router:Router) {
router.events.forEach((event) => {
if(event instanceof NavigationStart) {
}
// NavigationEnd
// NavigationCancel
// NavigationError
// RoutesRecognized
});
}
您还可以通过给定的事件进行过滤:
import 'rxjs/add/operator/filter';
constructor(router:Router) {
router.events
.filter(event => event instanceof NavigationStart)
.subscribe((event:NavigationStart) => {
// You only receive NavigationStart events
});
}
使用
pairwise
运算符
来获取前一个和当前事件也是一个不错的主意。
https://github.com/angular/angular/issues/11268#issuecomment-244601977
import 'rxjs/add/operator/pairwise'; import { Router } from '@angular/router'; export class AppComponent { constructor(private router: Router) { this.router.events.pairwise().subscribe((event) => { console.log(event); }); }; }
Günter Zöchbauer
2016-06-28
对于 Angular 7 ,应该这样写:
this.router.events.subscribe((event: Event) => {})
详细示例如下:
import { Component } from '@angular/core';
import { Router, Event, NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
@Component({
selector: 'app-root',
template: `<router-outlet></router-outlet>`
})
export class AppComponent {
constructor(private router: Router) {
this.router.events.subscribe((event: Event) => {
if (event instanceof NavigationStart) {
// Show loading indicator
}
if (event instanceof NavigationEnd) {
// Hide loading indicator
}
if (event instanceof NavigationError) {
// Hide loading indicator
// Present error to user
console.log(event.error);
}
});
}
}
Сергій Козюк
2018-11-08