2017-08-02 88 views
2

我使用的BehaviorSubject这里的文章如下:如何使用BehaviourSubject获取所有项目和单个项目?

https://coryrylan.com/blog/angular-observable-data-services

在这篇文章中笔者使用loadAll()加载单个条目中的所有项目和load()load()然后将检索到的项目推送到dataStore,然后将其发送到next(...)函数,以便所有订户得到通知。我不能确定这是否是正确的方法。我不知道为什么,但我觉得这很奇怪,我们应该如何设计我们的服务。我可能是错的,因为我是BehaviorSubject的新手。所以我的问题是,这是检索所有项目和单个项目的正确方法,还是有更好的方法?

回答

2

从我所看到的... 的方式太多的开发人员使用BehaviorSubject时,一个简单的解决方案就足够了。

只有在数据未绑定时,如果您有复杂的需求来监视数据更改,行为主题才真正需要。否则,简单的数据绑定会为您监视更改。

这是代码我在我的服务让所有并得到一个:我修改从由OP提供的链接plunker

getProducts(): Observable<IProduct[]> { 
    return this._http.get<IProduct[]>(this._productUrl) 
     .do(data => console.log('All: ' + JSON.stringify(data))) 
     .catch(this.handleError); 
} 

getProduct(id: number): Observable<IProduct> { 
    return this.getProducts() 
     .map((products: IProduct[]) => products.find(p => p.productId === id)); 
} 

,我的成绩在这里:https://plnkr.co/edit/r5PMFprgoWbzmFPTK3xN?p=preview

注它提供了与NO BehaviorSubject和更简化的代码相同的基本功能。

+0

我确实需要观察数据变化。 – user8408326

+0

我在提问的基础上发布文章。想象一下,这篇文章随着时间的推移会返回大量数据。 – user8408326

+0

@deborak我没有做任何特别的数据。通过HTTP检索它,然后将其映射到某个实体,最后使用'ngFor'绑定它。数据会经常改变。 – user8408326

1

观察的,主题& BehaviorSubject

Difference Between Observable and Subject

如果你所关心的是数据检索,然后DeborahK的答案是非常正确的。通常情况下,我会轻描淡写地说,HTTP请求是一种标准的可观察事件,这意味着请求会退出,返回,返回一些数据,并且不会再次被触发,直到对其进行新的订阅为止。对于大多数可观察的模式,标准Observable类型是完美的工作。

最简单的考虑方法就是看名字;观察到。如果你所做的只是'获取'数据,那么Observable就是你想要的。但是,如果您发现需要在实例化后操作数据流,则可能是最合适的。 SubjectBehaviorSubject之间的差异在于Subject必须具有初始值,其中BehaviorSubject在实例化上被赋予初始值。

SubjectBehaviorSubject的用例的一个很好的例子是一个布尔值,在站点中用于告诉应用何时应该可见或不可见模态。由于多个组件可能会改变模态的可见性状态,因此您需要可以更改的BehaviorSubject,从而触发父组件显示模态。

Subject的另一个好例子是一个搜索栏,它将内容通告给整个应用程序中的其他组件。这里的关键在于你发布了新的值给应用程序内其他组件/服务要观察的流。

我会说的最后一件事是,从技术上讲,以上所有属于Observable的类别。我认为这是很多混乱发生的地方。

数据推

我注意到你的问题的另一件事是,好像你实际上是试图解决的一个问题,是不是一定角度范围内可解本身。如果您的“后端”中有非常动态的数据,并希望将其推送到您的前端,那么您可能需要查看一个websocket套接字服务器。它听起来比它更复杂,但本质上它允许您的服务器将数据“推送”到您的应用程序。如果它是安全数据,我建议使用您的服务器推送“可用更新”消息,然后让应用程序安全地为更新的数据发出HTTP请求。不要通过网络套接字发送安全信息。 Here is a great resource适用于在节点服务器内使用Socket IO的websockets,并推送到Angular App。那里有很多东西。

+0

谢谢。这就说得通了。然而,我不想推送数据。 – user8408326

+0

我想说,您可以利用Angular的变化检测和绑定来完成您的两个示例,而不需要BehaviorSubject。 – DeborahK

+0

他们可能会,但这取决于应用程序结构。例如,使用标准数据绑定,尝试在非直接父/子组件或甚至在父模块和惰性加载模块之间进行通信的组件之间进行通信变得非常困难。 – joshrathke

相关问题