Angular8 路由事件使用

利用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(导航开始)
image.png
ActivationEnd(路由激活成功)app

image.png

NavigationStart(导航结束)
image.png框架

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 }
    });
  }
相关文章
相关标签/搜索