每次打开组件时如何调用函数?

Posted

技术标签:

【中文标题】每次打开组件时如何调用函数?【英文标题】:How to call a function eveytime a component is opened? 【发布时间】:2018-08-19 18:52:17 【问题描述】:

我有一个连接到 firebase 数据库并下载所有项目的应用程序,然后这些项目显示在如下表格中:

此表仅在我登录时显示,但一旦我移动到另一个组件并返回到带有表的组件,数据就不再加载。

我认为那是因为我在 onInit() 函数中有以下代码:

  ngOnInit() 
    this.taskService.getTasks().subscribe(tasks => 
      this.tasks = tasks;
    );
   

这基本上只是读取数据并将其添加到数组中。 然后如果数组长度> 0,则数据将显示在表格中:

<div *ngIf="tasks?.length > 0;else noTasks">
</div>

我试图通过使用来解决这个问题

  ngOnChanges() 
    this.taskService.getTasks().subscribe(tasks => 
      this.tasks = tasks;
    );
  

但没有任何改变。 所以.. 有没有办法在每次加载组件时调用函数,或者我的问题与另一件事有关?

【问题讨论】:

你能搞定那个吗?? 您的代码应该在 ngOnInt() 中,这是正确的!你错过了别的东西。你在改变路线吗? 是的,当我从导航栏中单击一个按钮时,另一个组件被加载,我将我的 repo 上传到 github 酷分享链接...... 注意到您没有在 ngOnDestroy() 中保存和清理您的订阅。这可能会有所帮助,具体取决于您的服务使用的可观察对象类型。 【参考方案1】:

好的,在查看所有事件之后,我认为您会使用此事件ngAfterViewChecked。这样,您可以在每次检查视图时执行您的函数。此外,ngOnInit 仅在应用程序加载时工作一次,之后将不再执行。使用ngAfterViewChecked。再次,请查看我给你的链接!

ngAfterViewChecked()  
this.taskService.getTasks().subscribe(tasks => 
      this.tasks = tasks;
    );

【讨论】:

看这个资料link 也不行,需要重新加载页面才能加载信息 另外,您可以使用ngAfterContentCheckedngDoCheck 没有改变,同样的问题 :( 我不太确定,也许 angular 事件正在起作用,但您的服务有问题。拜托,你说你有你的项目的回购。可以分享一下吗?【参考方案2】:

正如@jornara 指出的那样,我应该在 ngOnDestroy() 中使用 unsubcribe(),如下所示:

  //Variable to keep track of the subscription
  sub: any;

  //Calling the subscription
  ngOnInit()
    this.sub = this.taskService.getTasks().subscribe(tasks => 
      this.tasks = tasks;
    );
  

  //Calling unsubscribe on the initial variable
  ngOnDestroy()
    this.sub.unsubscribe();
  

【讨论】:

【参考方案3】:

由于我的评论给了你解决方案,我会详细说明答案。

所有继承 Observable 的类(Subject、BehaviourSubject、ReplaySubject 和 Observable 本身)本质上是一个您订阅的流,它会记住您的回调,直到您取消订阅。

因此,最终退订任何订阅非常重要。

除非: 一些 Observable 是从内部关闭的。例如所有的 HttpClient 动词。 (获取、发布、放置..)

至少有三种方法可以跟踪您的组件订阅,对于一两次订阅,最简单的一种是将它们保存在一个变量中,您可以在适当的时候取消订阅。

  //Variable to keep track of the subscription
  taskSubscription: Subscription;

  //Creating the subscription
  ngOnInit()
    this.taskSubscription = this.taskService.getTasks()
        .subscribe(tasks => this.tasks);
  

  //Calling unsubscribe on the subscription variable when the component is destroyed
  ngOnDestroy()
    this.taskSubscription.unsubscribe();
  

【讨论】:

以上是关于每次打开组件时如何调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

JUCE ViewPort 如何

如何使用 matlabcontrol 从 Java 调用 Matlab 函数而不每次都启动新会话?

Angular2,为啥每次移动鼠标时都会调用函数

每次调用 C++ 函数时,如何防止变量重新初始化?

React 组件上调用方法如何传递参数,除了匿名函数用更好的方法吗

每次在 jquery 中调用此函数时,如何添加自定义动画持续时间