角度服务:我应该公开实际数据还是用可观察的数据包装?

时间:2018-08-02 19:39:36

标签: angular rxjs

在Angular中(当前为6个),我应该有一个公开对象列表的服务,还是应该用可观察的对象包装该列表?

这是我公开对象的简单列表的方式:

export class TicketService {

  private _tickets: List<Ticket>;

  constructor() { }

  init() {
    this.backend.getTickets().subscribe(tickets => this._tickets = tickets);
  }

  getTickets() {
    return this._tickets;
  }
}

这看起来非常简单,这也是我使用angularjs 1.x做到的。显示数据的组件指向与服务相同的对象,因此在服务中对对象所做的任何更改都将自动显示在视图层中。

这仍然是Angular中可接受的模式吗?还是我需要使用此处所述的Observables:https://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/

第一种方法行得通吗?秒方法的优点是什么?

1 个答案:

答案 0 :(得分:0)

在这里,您基本上是在发出HTTP请求并缓存结果。

现在任何人都可以访问该结果。很好,但有几个问题:

(1)如果HTTP请求失败,该怎么办。

(2)如果票证在后端已更改,我如何请求更新的票证?

(3)订阅基于RxJS主题的​​服务的组件-请参见https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service-该组件可以非常轻松地合并HTTP请求,自动通知数据更改,而无需从服务中请求数据。它与HTTP polling v websockets范例相同,但在组件级别上相同。在前者中,客户端会定期向服务器发出请求以检查数据是否已更改(当没有数据已更改且仅当客户端发出请求时才立即接收到更改,而不会立即收到更改),可能会发出无效的coz请求),而在后者中,服务器告诉客户数据已更改,并将新数据提供给客户(完美,总效率和立即更改通知)。

如果可以保证HTTP请求不会失败并且数据不会更改,那么您的方法很好。否则我会重新考虑。

提示:高级-订阅RxJS主题的​​组件仅在发出新数据时被订阅的情况下才接收新数据。如果不是这种情况,请考虑使用RxJS重播主题,甚至最好使用诸如ngrx之类的全局存储解决方案。

PS:无需包装任何东西,this.backend.getTickets()是可观察的