如何在每次打开组件时调用函数?
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();
}
我有一个连接到 firebase 数据库并下载所有项目的应用程序,然后项目显示在 tables 中,如下所示:
我认为那是因为我在 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();
}