【问题标题】:how to find if page is reloaded/refreshed or navigated in Angular如何查找页面是否在 Angular 中重新加载/刷新或导航
【发布时间】:2018-11-27 19:07:41
【问题描述】:

我必须找出页面是否因为某些路由而被刷新或加载。

我认为可以通过subscribeing 对路由器事件使用Angular RouterNavigationEnd 事件。

有人知道怎么做吗?

请不要使用纯 JavaScript 解决方案。

【问题讨论】:

    标签: angular angular-router angular-router-events


    【解决方案1】:

    当然,你可以这样使用它:

    1. 您可以在Router 实例上收听events Observable。
    2. 它将触发很多事件。所以你可能想过滤掉不必要的事件,只使用你感兴趣的事件类型,即NavigationEnd。你可以使用 Rxjs 的 filter 操作符来实现它。
    3. 订阅NavigationEnd 时,您将获得一个类型为NavigationEnd 的事件对象。它具有 urlAfterRedirectsurl 等属性,您可以利用这些属性来了解路由操作是否导致导航到特定组件。
    4. 在刷新/重新加载的情况下,NavigationEnd 事件不会触发。因此,如果发生这种情况,您可以确定这是一个页面被路由到的情况。

    类似这样的事情:


    import { Component, OnInit } from '@angular/core';
    import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
    import { filter } from 'rxjs/operators';
    
    @Component({...})
    export class YourComponent implements OnInit {
    
      constructor(
        ..., private router: Router, ...
      ) { }
    
      ngOnInit() {
        ...
    
        this.router.events
          .pipe(
            filter(event => event instanceof NavigationEnd)
          )
          .subscribe((event: NavigationEnd) => {
            console.log('Got the Event URL as ', event.url);
            if(event.urlAfterRedirects.includes('project')) {
              console.log('This was redirected to the Project Component');
            }
          });
        ...
      }
    
      ...
    
    }
    

    这里有一个Sample StackBlitz 供您参考。

    PS:要确认第 4 点,只需尝试按下 StackBlitz 的 View Mode 上的重新加载按钮,然后检查控制台上是否打印任何内容。由于这是重新加载,因此不会打印任何内容。这可以被认为是刷新/重新加载情况的确定性。

    【讨论】:

    • 但是我怎么知道它是刷新/重新加载还是页面被路由到?
    • @Jocket,尝试更新的答案。检查 第 4 点PS,希望您应该清楚。 :)
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2014-06-26
    • 2011-02-17
    • 1970-01-01
    • 2017-06-20
    • 2013-02-12
    相关资源
    最近更新 更多