【发布时间】:2016-12-21 19:15:09
【问题描述】:
我编写了以下 reducer 来将状态项存储在我的 Angular 2 应用程序中。这些项目是金融工具(例如股票/货币)的报价。
我的 Reducer 实现如下:
export const offersStore = (state = new Array<Offer>(), action:Action) => {
switch(action.type){
case "Insert":
return [
...state, action.payload
];
case "Update":
return state.map(offer => {
if(offer.Instrument === action.payload.Instrument)
{
return Object.assign({}, action.payload);
}
else return offer;
});
case "Delete":
return state.filter(offer => offer.Instrument !== action.payload )
default:
return state;
}
}
我设法让插入、更新和删除功能正常工作 - 尽管这并不容易。我发现 Redux 是一种范式转变,与我多年来的编码方式有所不同。
我的应用程序上有一个仪器组件/页面 - 它显示了一个特定仪器的所有可用信息,由 InstrumentId 指示,例如“EUR/USD”(存储在 payload.Instrument 属性中)。
我的问题是,我不确定如何有效地搜索特定乐器并将其从商店中抢走。不仅如此,如果商店中的仪器更新,我还希望更新我获取的仪器,因为它们经常通过服务器的 websocket 推送。所以我真的需要在商店中搜索特定乐器,并将其作为 Observable 返回,它将根据推送到商店的新数据继续更新视图组件。
我怎样才能做到这一点?
【问题讨论】:
-
我在第一次开始使用 redux/ngrxStore 时遇到了许多相同的问题。我从 ngrx 示例应用程序中获得了很大的灵感。 github.com/ngrx/example-app 如果您查看他们构成状态和检索值的方式,它会有所帮助。使用 Redux,鼓励您将状态标准化为类似于数据库表。我的第二个障碍是学习如何有效地使用 observables 和 rxjs。如果做得好,您可以真正简化您的代码并使其非常易读(假设您了解 rxjs 运算符)并且您的应用程序非常快速且可测试。
-
这些移植到使用 ngrx/store 的 react/redux 示例也可能有所帮助。 github.com/btroncone/ngrx-examples
-
它们本质上是针对状态构建索引。 const newBookEntities = newBooks.reduce((entities: { [id: string]: Book }, book: Book) => { return Object.assign(entities, { [book.id]: book }); }, {}) ;
-
然后使用该id直接获取对象。 state$ .select(s => s.entities[id]);
-
这有帮助吗?
标签: angular typescript redux store ngrx