angular - Ngrx Store:执行某些操作后,有什么方法可以获取状态差异
问题描述
我正在使用 ngrx store 来构建复杂的存储结构,如代码所示:
模型.ts
export interface ITableState {
tables: ITables,
selectedTableId: number
}
export interface ITables {
[id: number]: ITable
}
export interface ITable {
menus: IMenus,
selectedMenuId: string
}
export interface IMenus {
dishId: number,
dishName: string
}
减速器.ts
case tables.ActionTypes.ADD_MENU: {
var menuToAdd = <IAddMenu>action.payload;
return {
...state,
tables: {
...state.tables,
[menuToAdd.tableId]: {
...state.tables[menuToAdd.tableId],
menus: {
...state.tables[menuToAdd.tableId].menus,
[menuToAdd.menuId]: menuToAdd.menu
}
}
}
}
}
我订阅这家商店如下:
export const getTableStructureState = (state: State) => state.table;
public tableStructureState$ = this.appState$.select(store.getTableStructureState);
this.tableSandbox.tableStructureState$.subscribe(tableDataState => {
console.log(tableDataState.tables[tableDataState.selectedTableId].menus)
});
因此,在执行 ADD_MENU 操作时,我得到了商店中的所有菜单。 但我的问题是
如果假设我添加了两个菜单,然后我又添加了第三个菜单,有什么方法可以让我知道最后添加的菜单是哪个。或者简单地说,状态发生了什么变化。
我已经搜索了很多,但没有得到任何解决方案。请让我知道它是否可能。提前感谢您的帮助。
解决方案
lastChange
例如,您可以将属性或更改历史记录保存到您的商店中......
然后创建一个返回最后更改的选择器。像这样,您将使用 NgRx 的强大功能。
export interface ITableState {
tables: ITables,
selectedTableId: number,
lastChange: IAddMenu
}
case tables.ActionTypes.ADD_MENU: {
var menuToAdd = <IAddMenu>action.payload;
// what was the previous change ?
const previousChange = state.lastChange;
if (previousChange.xxxxx) {
// do something depending on last change...
...
}
return {
...state,
tables: {
...
},
lastChange: action.payload // store new last change
}
}
希望这会帮助你。
推荐阅读
- html-table - DOMPDF 0.8.3 如何拆分长垂直表
- javascript - JS 文件无法在 CPanel 中加载
- recaptcha - 谷歌 reCAPTCHA 响应
- jar - 从命令行运行时,weld-se 无法在类路径的不同 jar 中找到 bean
- random - 线程“主”在“无法初始化 thread_rng:所有熵源失败”时惊慌失措
- php - 树枝模板生成中的路线
- angular - 如何使用 Angular 7 中的键列表查询 Firebase?
- javascript - 如何在 ChartJS 中用点制作虚线粗线?可能吗?
- android - 如何限制从 adb 启动服务?
- html - Bootstrap“img-responsive”在我的代码中不起作用,为什么?