“订阅”和“取消订阅”如何与Angular2中的Observable一起使用?
我的架构如下:
-
CRUD(Repo)服务,包含CRUD操作并返回Observable
-
与CRUD对话的中间服务 . 此服务注入组件并包含私有BehaviorSubjects . 我公开了潜在的 Value 观
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
是应用程序的状态对象 .
然而,它会在每个组件中带来所有这些“订阅/取消订阅”,根据我的理解,如果您不取消订阅,您将添加订阅数组的另一个订阅,这意味着任何更改现在将触发订阅下的代码两次 .
该应用程序应该具有'selectedItem'的概念吗?
1 回答
你的设计看起来很稳固 . 您可能需要考虑
ngrx/store
,它们也使用Observables / BehaviorSubjects
,但还实现了Redux模式,这提高了整体代码的可读性和设计 .通常您不需要取消订阅Observables,例如HTTP observable在返回值(或错误)后自行完成 .
Observable需要在未完成时取消订阅,例如
Observable.timer
,或者从routerService
检索参数 .