【问题标题】:Angular: changing single route emits multiple 'NavigationEnd' eventsAngular:更改单个路线会发出多个“NavigationEnd”事件
【发布时间】:2018-03-21 02:57:42
【问题描述】:

我正在使用 Angular 4,这是我在其中一个组件中的代码,我需要在其中捕获该路由已更改并重新加载页面。

ngOnInit() {
        this.router.events.subscribe((value) => {
          if (value instanceof NavigationEnd) {
             console.log(value);
          }
        });
    }

我的问题是我在一条路线上收到了多个“NavigationEnd”事件。 对于某些路由 console.log 甚至写入 6,7 值。

这是怎么发生的?

【问题讨论】:

    标签: angular typescript rxjs angular-router


    【解决方案1】:

    我假设“重新加载页面”是指调用this.routernavigate 方法。如果是这样的话,这很可能与您每次创建此组件的实例时都创建一个新的路由器事件观察者有关,但不要在ngOnDestroy 循环中处理生成的subscription。要解决此问题,您可以执行以下操作:

    import { Subscription } from 'rxjs/Subscription';
    import 'rxjs/add/operator/do';
    import 'rxjs/add/operator/filter';    
    
    export class FooComponent implements OnInit, OnDestroy {
       private _routerSub = Subscription.EMPTY;
       constructor(private router: Router){}
    
       ngOnInit(){
         this._routerSub = this.router.events
             .filter(event => event instanceof NavigationEnd)
             .do(event => console.log(value)) // use do operator for log operations
             .subscribe((value) => {
              //do something with the value
             });
       }
    
       ngOnDestroy(){
         this._routerSub.unsubscribe();
       }
    }
    

    【讨论】:

    • 感谢您的快速回复。那是我的问题,我没有销毁“ngOnDestroy”上的取消订阅事件。我不知道我应该这样做:)
    • 根据 Angular 文档,这不是必需的。路由器事件是冷可观察的,不需要取消订阅。
    • Router.events observable 的冷/热与取消订阅的必要性无关。你从哪里得到的?
    • angular.io/guide/router#!#route-parameters 。但我现在看到它是对 ActivatedRoute 的订阅
    • 我正在销毁 ngOnDestroy 上的订阅者,但这给我带来了问题,它在获取 navigationend 实例之前取消订阅。请问谁能告诉我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2018-09-19
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多