我发生了一件奇怪的事情,我不知道该怎么解决...
为了对此进行测试,我创建了一个包含字符串有效负载和选择器订阅的操作。
我的选择器是:
const getLoginFeatureState = createFeatureSelector<LoginState>('login');
export const loginResult = createSelector(getLoginFeatureState, state => state.loginResult)
操作:
export class LoginSuccess implements Action {
readonly type = LoginActionTypes.loginSuccess
constructor(public payload: string) { };
}
我的订阅是:
this.loginStore.pipe(select(loginSelectors.loginResult)).subscribe(loginResult => {
console.log(loginResult);
});
我正在执行以下操作:
this.loginStore.dispatch(new loginActions.LoginSuccess("Test1"));
this.loginStore.dispatch(new loginActions.LoginSuccess("Test2"));
this.loginStore.dispatch(new loginActions.LoginSuccess("Test2"));
this.loginStore.dispatch(new loginActions.LoginSuccess("Test3"));
我的console.log显示
Test1
Test2
Test3
它完全忽略了重复的Test2。
这是为什么?
在我的NgRx开发工具中,它说“状态相等”,因此我猜测如果状态相等,NgRx不会触发事件吗?有没有办法告诉NgRx忽略它并始终通知我的订阅?
答案 0 :(得分:1)
这是设计使然。
一个选择器被记住-参见NgRx docs-当输入相同时,它将不会重新执行投影机。
Alex Okrushko在去年NgRx: Selectors are more powerful than you think
上对这个概念以及如何根据您的需求进行了调整。