【发布时间】:2021-01-10 16:47:59
【问题描述】:
我有这个 Angular 应用程序,我想在其中为聊天对象创建自定义商店。
(代码沙盒:https://codesandbox.io/s/chat-store-yw4yz)
注意:我知道有像 ngrx 这样的工具,但这是一个更大项目的一部分,我更喜欢使用这个自定义实现,以便更好地了解商店的行为。
上下文
使其快速高效的想法是在存储中存储两种类型的记录:
- 带有
key = chat id和value = chat object的字典(作为地图) - 按groupId 对聊天进行分组的索引(作为地图),其中
key = groupId和value = chatId
所以我有这个接口定义:
export interface ChatStoreModel {
chats: Map<number, Chat>;
chatsByGroup: Map<number, number[]>;
}
当聊天对象被保存到 Store 中时,会发生两件事:
- 聊天对象被保存到存储
chats - 聊天 id 保存在相应的 groupId 中的 store
chatsByGroup
问题
无法从群组中获取聊天对象。我执行以下操作:
- 使用 groupId 从商店
chatsByGroup获取聊天 ID 列表 - 对于每个聊天ID,从商店
chats获取元素
代码:
getGroupChats$(groupId: number): Observable<Chat[]> {
return this._store.select("chatsByGroup").pipe(
map((chatsByGroup) => chatsByGroup.get(groupId) || []),
switchMap((ids) => {
if (!ids || !ids.length) {
return of([]);
}
const chatsList$: Observable<Chat>[] = ids.map((id) =>
this._store.select("chats").pipe(map((chats) => chats.get(id)))
);
return forkJoin([...chatsList$]).pipe(
map((list) => {
return ([] as Chat[]).concat(...list);
})
);
}),
shareReplay(1)
);
}
调试此代码,它到达return forkJoin 行,并且 ids 有聊天列表,但它从未到达map((list) => { 行,因此应用程序不显示聊天列表。
任何帮助将不胜感激,谢谢!
【问题讨论】:
标签: angular rxjs ngrx store ngrx-store