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

How to call a function eveytime a component is opened?

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

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

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

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

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

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

我尝试使用

来解决这个问题
  ngOnChanges() {
    this.taskService.getTasks().subscribe(tasks => {
      this.tasks = tasks;
    });
  }

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

好的,在查看所有事件后,我认为您会使用此事件 ngAfterViewChecked。这样,您可以在每次检查视图时执行您的功能。此外,ngOnInit 仅在应用程序加载时运行一次,之后将不会再次运行。使用 ngAfterViewChecked。再次请大家回顾一下我给你的link!

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

正如@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();
  }

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

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

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

除非: 一些 Observables 从内部关闭。在示例中,所有 HttpClient 动词。 (得到,post,放..)

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

  //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();
  }