Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular redux和ngrx-通过在同一个减速机中进行更改,避免不必要的值触发_Angular_Redux_Rxjs_Ngrx - Fatal编程技术网

Angular redux和ngrx-通过在同一个减速机中进行更改,避免不必要的值触发

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

我想这是一个一般的ngrx/rxjs问题。我有三个数据阵列:

  • 计划
  • 待办事项
  • 事件
目前,我将它们都放在一个名为data的简化程序中

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; });