利用Angular提供得路由系统能够比较方便地构建项目得框架结构,同时还内置了路由对象事件,能够帮助解决开发中较为常见的问题。javascript
在app组件中注入Router类,订阅路由的event事件:java
constructor( private http: HttpClient, private router: Router, private activatedRoute: ActivatedRoute, ){} ngOnInit(): void { this.router.events.pipe( tap(o => console.log(o)) ).subscribe(route => { console.log(route); }); }
路由状态
有路由导航开始,导航结束;路由配置加载开始,配置加载结束;路由识别,子路由激活开始,激活结束;路由激活开始与结束等。这些路由事件均有各自最佳的场景,可是先后顺序基本是不变的,导航开始是第一个,当其他事件结束,最后导航结束,咱们能够根据这个状态去设置业务需求,先查看通常的路由事件中,event
包含的内容。浏览器
NavigationStart(导航开始)
ActivationEnd(路由激活成功)
app
NavigationStart(导航结束)
框架
id 即为 navigationId ,被用于保存历史记录,以供浏览器导航回来。只有当此次导航是被 popstate 事件触发时,它才不为空。路由器会把一个 navigationId 赋予每一次路由器过渡/导航。即便用户点击了浏览器的后退按钮,也会建立一个新的 navigationId。 因此,从路由器的视角来看,路由器永远不会 "后退"。借助 restoredState 及其 navigationId,你能够区分开建立新状态和 popstate 事件的行为。 在 popstate 时,你能够恢复一些之前记录的状态(如滚动到的位置)。
navigationTrigger 为导航过程当中的触发器,映射关系为:
router.navigateByUrl / router.navigate => imperative
popstate => popstate
hashchange => hashchange
data 为路由设置中提供的路由信息,例如标题等;
其它诸如参数等信息也能够经过这个对象获取。
准确地获取标题,调用内置的Title.setTitle 设置网站标题。咱们只须要在路由激活下获取data便可。网站
this.router.events.pipe( // tap(o => console.log(o)) filter(event => event instanceof NavigationEnd), map(() => this.activatedRoute), map(route => { while (route.firstChild) { route = route.firstChild; } return route; }), mergeMap(route => { return route.data; }), ).subscribe(route => { console.log(route); });
简单解释下上述代码:filter
选择 NavigationEnd
的缘由是找激活路由的快照,只有在导航结束事件只有一次,若是选择 ActivationEnd
也能够,可是此事件触发屡次;
获取到当前路由,在当前路由的第一个子路油出现的时候返回子路由;
mergeMap 将本来的Observable打平为数据返回给订阅者接收,结果为:this
{ title:'新闻中心' }
添加参数:
1.HTML中添加:<a [routerLink]="['/contact']" routerLinkActive="router-link-active" [queryParams]="{id:222}">联系咱们</a>
2.spa
this.router.navigate(['/contact'], { queryParams: { id: 123456 } }); 或者 this.router.navigateByUrl('/contact?id=484584');
获取参数:rest
constructor( private modal: NzModalService, private activedRoute: ActivatedRoute ) { } ngOnInit() { this.activedRoute.queryParams.subscribe(params => { console.log(params);// { id: 123 } }); }