Angular redux和ngrx-通过在同一个减速机中进行更改,避免不必要的值触发
我想这是一个一般的ngrx/rxjs问题。我有三个数据阵列:Angular redux和ngrx-通过在同一个减速机中进行更改,避免不必要的值触发,angular,redux,rxjs,ngrx,Angular,Redux,Rxjs,Ngrx,我想这是一个一般的ngrx/rxjs问题。我有三个数据阵列: 计划 待办事项 事件 目前,我将它们都放在一个名为data的简化程序中 const INITIAL_STATE: State = { projects: [], todos: [], events: [] }; 我使用自定义选择器订阅属性 export const getProjects = createSelector(getDataState, fromData.getProjects); expor
- 计划
- 待办事项
- 事件
const INITIAL_STATE: State = {
projects: [],
todos: [],
events: []
};
我使用自定义选择器订阅属性
export const getProjects = createSelector(getDataState, fromData.getProjects);
export const getTodos = createSelector(getDataState, fromData.getTodos);
所以在一个组件中,我有
store.select(fromRoot.getProjects).subscribe()
如果我理解正确的话,如果整个减速机有任何变化,每次都会激发项目的价值
因此,TODO可能有10次更改,项目仍将触发相同值的10倍,可能会不必要地触发订阅中的功能10次
除了为每个属性创建一个单独的减速机之外,还有其他方法可以避免这种情况吗?您测试过吗?因为答案是否定的,只有在状态的
getProjects
切片上发生更改时才会触发
此外,您可能希望将组件拆分为智能/哑组件,并使用async
pipe将数据绑定到哑组件。这样,您就根本不订阅存储,因为async
pipe会为您订阅存储
然后在智能组件中,您只需编写:
this.propertyX$=this.store(yourReducer.yourReducerStateProperty)代码>
在smart components html中,您绑定到哑组件:
一种方法是将它们分成不同的减速器
另一种方法是创建自定义选择器,如下所示
this.foo=store.select('somereducer').pull('yourtargetobject').distinctUntilChanged()
若需要比较对象中的值以区分对象是否已更改,则可以使用比较器
/* With comparer */
var source = Rx.Observable.of({value: 42}, {value: 42}, {value: 24},
{value: 24})
.distinctUntilChanged(function (x) { return x.value; }, function
(a,b) { return a !== b; });