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

时间:2016-09-23 18:00:28

标签: angular rxjs angular2-routing observable

'subscribe'和'取消订阅'如何在Angular2中使用Observable?

我的架构如下:

  1. 包含CRUD操作并返回的CRUD(Repo)服务     可观察到的
  2. 与CRUD对话的中间服务。此服务注入组件并包含私有BehaviorSubjects。我将基础值公开为

    get selectedClient(): Observable<Client> {
        return this._selectedClient.asObservable();
    }
    
    get clients(): Observable<Client[]> {
        return this._clients.asObservable();
    }
    
  3. 在组件级别,我通过订阅以前提到的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();
    
  4. 首先我想问一下,这个设计有什么问题吗? 其次,我何时需要取消订阅以及何时不取消?

    我们的想法是selectedClient是应用程序的状态对象。

    然而,它会在每个组件中带来所有这些'subscribe / unsubscribe',根据我的理解,如果您不取消订阅,您将添加订阅数组的另一个订阅,这意味着任何更改现在将触发订阅下的代码两次。

    应用程序是否应该具有'selectedItem'的概念?

1 个答案:

答案 0 :(得分:1)

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

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

可观察者需要在他们完成时取消订阅,例如Observable.timer,或者从routerService检索参数。