angular中路由的应用

2016-12-23  本文已影响250人  琢磨先生lf

动态路由替代方案

网页搜索(翻墙)没有找到关于ng2的动态路由的资料,尝试通过替代方案解决
html代码:

<nav class="app_nav">
        <div *ngFor="let item of currentUser?.frontSet;let last = last;" [isLast]="last" (lastDone)="initNav()">
            <a [routerLink]="item.code" [queryParams]="{userName : currentUser.name}" routerLinkActive='active'>
                  {{item.moduleName}}
            </a>
        </div>
    </nav>

directive监听ngfor结束事件:

import { Directive, Input, Output, EventEmitter, OnInit} from "@angular/core";

@Directive({
  selector : '[isLast]'
})

export class IsLastDirective implements OnInit {
  @Input() isLast: boolean;
  @Output() lastDone: EventEmitter<boolean> = new EventEmitter<boolean>();

  ngOnInit(): void {
    if (this.isLast) {
      this.lastDone.emit(true);
    }
  }
}

initNav方法

  initVav() {
    if (((location.href.substring(location.href.indexOf('#') + 1,
      location.href.length)).length === 1) || location.href.indexOf('code') > -1) {
      let url = this.currentUser.frontSet[0].code;
      let id = this.currentUser.frontSet[0].id;
      if (id === '1') {
        let navigationExtras: NavigationExtras = {
          queryParams: {
            userName: this.currentUser.name
          }, fragment: 'anchor'
        };
        this.router.navigate([url], navigationExtras);
      } else {
        this.router.navigate([url]);
      }
    }
  }

通过ts触发讲路由指向第一个

应用路由事件来做一些控制

参考:https://angular.cn/guide/router#路由事件
场景1:
angular项目是一个单页面的应用,我们需要控制每次切换路由都让滚动条回到顶部
解决办法是在跟组件中加入以下代码

private router: Router

this.router.events
        .filter(event => event instanceof NavigationEnd)
        .subscribe((event: NavigationEnd) => {
          document.body.scrollTop = 0;
        });

this.router.events返回的是一个obversable对象,event也分为很多种,我们过滤出NavigationEnd事件进行监听即可
场景2:
在父子路由中,子路由变了,希望父路由组件做一些处理,比如样式变化、页面布局或一些复杂交互

ngOnInit() {
        this.routeSubscribe = this.router.events
        .filter(event => event instanceof NavigationEnd)
        .subscribe((event: NavigationEnd) => {
            ...    // 业务代码
        });
    }

    ngOnDestroy() {
      this.routeSubscribe.unsubscribe();
    }

用一个变量接收,然后在OnDestroy中注销

上一篇下一篇

猜你喜欢

热点阅读