'subscribe'和'取消订阅'如何在Angular2中使用Observable?
我的架构如下:
与CRUD对话的中间服务。此服务注入组件并包含私有BehaviorSubjects。我将基础值公开为
get selectedClient(): Observable<Client> {
return this._selectedClient.asObservable();
}
get clients(): Observable<Client[]> {
return this._clients.asObservable();
}
在组件级别,我通过订阅以前提到的getter来访问数据:
deleteClient() {
this.selectedClient.subscribe(actualClient => {
this.clientStore.deleteClient(actualClient).subscribe(response => {
if (response) {
this.router.navigate(['/clients']);
}
});
}).unsubscribe();
}
updateClient() {
this.clientUpdateForm.submitClientForm().subscribe(client => {
if (client) {
this.growlService.showInfoMessage("Client updated", client.firstName + " " + client.lastName);
}
}).unsubscribe();
}
this.selectedClient.subscribe(client => {
this.clientForm = this.clientUpdateForm.clientForm;
}).unsubscribe();
首先我想问一下,这个设计有什么问题吗? 其次,我何时需要取消订阅以及何时不取消?
我们的想法是selectedClient
是应用程序的状态对象。
然而,它会在每个组件中带来所有这些'subscribe / unsubscribe',根据我的理解,如果您不取消订阅,您将添加订阅数组的另一个订阅,这意味着任何更改现在将触发订阅下的代码两次。
应用程序是否应该具有'selectedItem'的概念?
答案 0 :(得分:1)
你的设计看起来很稳固。您可能需要考虑ngrx/store
,他们也会使用Observables / BehaviorSubjects
,但还会实现Redux模式,从而提高整体代码的可读性和设计。
通常您不需要取消订阅Observable,例如HTTP observable在返回值(或错误)后自行完成。
可观察者需要在他们完成时取消订阅,例如Observable.timer
,或者从routerService
检索参数。