在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/
第一种方法行得通吗?秒方法的优点是什么?
答案 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()是可观察的