如何调用函数eveytime打开一个组件?

时间:2018-03-11 18:32:17

标签: angular angular5 ngoninit

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

enter image description here 只有在我登录时才会显示此表,但只要我移动到另一个组件并返回到包含表格的组件,就不会再加载数据了。

我认为那是因为我在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;
    });
  }

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

由于我的评论为您提供了解决方案,我将详细说明答案。

继承Observable(Subject,BehaviourSubject,ReplaySubject和ofcourse Observable本身)的所有类本质上都是您订阅的流,它会在您取消订阅之前记住您的回调。

因此,最终取消订阅任何订阅都很重要。

除非: 一些Observables从内部关闭。在示例中所有的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();
  }

答案 2 :(得分:-1)

好的,在审核了所有活动后,我认为您将使用此活动{ "data": [ { "id": 13, "name": "Event 1", "description": "test" }, { "id": 16, "name": "Event 2", "description": "dsadfa adf asd" } ], "meta": {...} } 。通过这种方式,您可以在每次检查视图时执行您的功能。此外,ngAfterViewChecked只在加载应用程序时工作一次,之后,它将不会再次执行。使用ngOnInit。再次,请查看我给你的链接!

ngAfterViewChecked