【问题标题】:angular 4 call component method when re-routing to it重新路由到它时,角度4调用组件方法
【发布时间】:2019-04-13 22:44:47
【问题描述】:

我有一个路由策略,在路由到另一个组件时不会破坏该组件。我想在(重新)路由到组件时调用组件的方法。

到目前为止,我已经尝试使用它们各自的方法 ngAfterContentChecked 和 `ngAfterViewChecked 来实现接口 AfterContentCheckedAfteViewChecked。实现其中一个接口的唯一问题是该方法在路由到组件时被多次调用,这对我来说是一个性能问题。

在研究网络时,我没有遇到可以实现以获得所需行为的界面。

解决这个问题的唯一可能性是,在路由器中验证选择了哪个路由/路径,如果是所需的,我调用组件的方法?

【问题讨论】:

  • 可以放入ngOnInit()函数。
  • @SunilSingh 不,我不能,因为 ngOnInit() 在组件初始化后只被调用一次,但是如果我重新路由到现有组件,则不会调用 ngOnInit再次。我试过了。
  • 您可以订阅路由器的事件,只要发生路由更改就会触发。这样你就可以检查你的组件,如果当前路由是你组件的路由并执行你需要的任何方法
  • 你可能想看看 Router Events
  • @Robin-Hoodie 您提出的解决方案非常有效。将解决方案发布为答案,以便我接受。

标签: angular components angular-routing angular4-router


【解决方案1】:

您可以订阅routerevents,每次您的路线更改时都会触发一个事件。然后你可以得到这个事件的活动路由,并检查你当前所在组件的路由是否等于该路由。

提示:使用instanceof NavigationEnd 过滤事件

【讨论】:

    【解决方案2】:

    您基本上可以添加注入 Router 作为依赖项,然后在其上订阅 events。有一个路由器公开的 events 列表。

    由于我们只关心NavigationEnd 事件,您可以使用filter 运算符将其过滤掉。

    事件数据有一个url 属性,可用于与NavigationEnd 之后获得的路径进行比较

    this.router.events
    .pipe(
      filter(event => event instanceof NavigationEnd)
    )
    .subscribe((event: any) => {
      console.log('Got the Event URL as '. event.url);
    })
    

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

    【讨论】:

      【解决方案3】:

      只要发生路由,就会创建组件并调用ngOnInit 函数。

      export class TestComponent implements OnInit{
        constructor(){
           //called first time before the ngOnInit()
        }
      
        ngOnInit(){
           //called after the constructor
        }
      }
      

      我们拥有的其他两个选项是 -

      1. Resover - resolve 函数

      2. Gaurds - canActive 函数

      ResolverGaurd 在路由发生变化时执行。

      【讨论】:

      • 我在我的问题中说过,我使用的路由策略不会破坏组件,因此它会重用已经创建的组件。
      • 我们拥有的其他两个选项是ResoverGaurds。只要路由发生变化,就会执行解析器和 Gaurd。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2018-05-12
      • 2018-05-17
      • 1970-01-01
      相关资源
      最近更新 更多