【发布时间】:2018-12-20 05:20:54
【问题描述】:
我有这个结构:
- product.service(用于服务)
- 产品搜索组件(用于设置当前选中的对象)
- compare-product 组件(用于订阅当前选中的对象)
我想在加载比较产品时订阅服务中的对象。一开始似乎还不错。但是,当我点击产品搜索的后退按钮,然后再次加载比较产品时,它订阅了两次。当我回去再次加载时,它被调用了三遍。返回,再次加载,调用四次,以此类推。
这些是代码:
服务:
//product.service
.......
private checkedSrc = new BehaviorSubject([]);
currentChecked = this.checkedSrc.asObservable();
.......
setChecked(checked: string[]){
this.checkedSrc.next(checked);
}
resetChecked(){
this.checkedSrc.next([]);
}
.......
产品搜索组件:
......
compare(){
this.products_valid = true;
this.productSvc.setChecked(this.checked);
this.router.navigate(['compare']);
}
......
比较产品组件:
...
products: string[];
isLoading: boolean = true;
constructor(
private productSvc: ProductsService
) { }
ngOnInit() {
this.productSvc.currentChecked.subscribe(p => {this.products = p; console.log(this.products)})
}
我已经尝试过,但没有导航到比较组件。当我第一次调用 compare 函数时它订阅了一次,再次调用 compare 函数它订阅了两次,再次调用它订阅了 3 次,依此类推。
......
compare(){
this.products_valid = true;
this.productSvc.setChecked(this.checked);
this.productSvc.currentChecked.subscribe(p =>{console.log(p);})
}
......
调用它的按钮:
<div class="row">
<div class="col-md-6">
<button class="btn btn-primary" style="margin-top: 20px;" (click)="compare()">Compare</button>
</div>
</div>
我也尝试在每次调用 compare 方法时使用 resetChecked() 重置对象,但还是一样...
【问题讨论】:
-
每次初始化组件时,您都会订阅它。为什么不应该订阅多次?当组件被销毁时,你应该取消订阅。