我有一个应用程序连接到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;
});
}
但没有任何改变。 那么......每次加载一个组件或者我的问题与另一个组件有关时,有没有办法调用一个函数?
答案 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