Javascript NgRx选择器在状态发生任何变化/选择器不工作时发出

Javascript NgRx选择器在状态发生任何变化/选择器不工作时发出,javascript,angular,rxjs,ngrx,Javascript,Angular,Rxjs,Ngrx,我使用Angular 7和NgRx。我已经创建了一个选择器,使用过滤器从存储中获取一些数据,但是当存储中的任何内容发生变化时,即使它与我的选择器无关,该选择器也会发出信号 我已经创建了一个演示我的问题。这是我的选择: export const getMyArrayFilter = createSelector( getCounterState, state => state.myArray.filter(x => x === 'new Item') ); this.

我使用Angular 7和NgRx。我已经创建了一个选择器,使用
过滤器
从存储中获取一些数据,但是当存储中的任何内容发生变化时,即使它与我的选择器无关,该选择器也会发出信号

我已经创建了一个演示我的问题。这是我的选择:

export const getMyArrayFilter = createSelector(
    getCounterState,
    state => state.myArray.filter(x => x === 'new Item')
);
this.store.pipe(select(fromRoot.getMyArrayFilter)).subscribe(x => console.log(x));
在这里,我使用我的
getMyArrayFilter
选择器:

export const getMyArrayFilter = createSelector(
    getCounterState,
    state => state.myArray.filter(x => x === 'new Item')
);
this.store.pipe(select(fromRoot.getMyArrayFilter)).subscribe(x => console.log(x));
但是正如前面提到的,这个
选择器将在状态发生任何变化时发出

请看一下StackBlitz演示

如果尝试单击“将项目添加到阵列”或“-”或“+”按钮,则my
getMyArrayFilter
将发出,并每次登录到控制台。我的选择器不应该只在我的状态更改时发出值吗


我看了一下SOF问题,其中提到使用
distinctunitrichanged
,但这似乎对我不起作用

使用您的示例进行一些测试时,我注意到ngrx通过引用而不是通过其中的每一项来比较数组,这意味着由于函数过滤器返回一个带有新引用的新数组,所以ngrx认为这是不同的,这就是为什么每次更改时都会调用subscribe

创建新副本将具有相同的效果:


导出常量getMyArrayFilter=createSelector(
getCounterState,
state=>[…state.myArray]
);

正如亚历杭德罗指出的,这是因为有了一个新的
myArray
参考。 你可以根据自己的需要修改备忘录,Alex Okrushko在他的演讲中就是这么做的


这是正常的,当存储中有任何更改时,选择器将发出新值。我不明白你有什么问题here@TonyNgo当我的状态发生变化时,我的选择器不应该只发出值吗?当有任何变化时,选择器将发出值。在代码中,您对
fromRoot.getCount()
调用了3次,因此它将返回3次数据