首页 文章

Angular2是使用Observables的正确方法吗?

提问于
浏览
1

“订阅”和“取消订阅”如何与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 回答

  • 1

    你的设计看起来很稳固 . 您可能需要考虑 ngrx/store ,它们也使用 Observables / BehaviorSubjects ,但还实现了Redux模式,这提高了整体代码的可读性和设计 .

    通常您不需要取消订阅Observables,例如HTTP observable在返回值(或错误)后自行完成 .

    Observable需要在未完成时取消订阅,例如 Observable.timer ,或者从 routerService 检索参数 .

相关问题