Angular 2 - ngrx订阅在每个状态更改上运行
问题描述:
我有一个基本的使用ngrx/store的redux实现。Angular 2 - ngrx订阅在每个状态更改上运行
//根减速
export const root = {
posts: fromPosts.reducer,
purchases: fromPurchases.reducer
}
export function getAllPosts(state) {
return fromPosts.getAll(state.posts);
}
export function getAllPurchases(state) {
return fromPurchases.getAll(state.purchases);
}
在我的组件,我选择状态件。
this.posts$ = store.select(getAllPosts).do(c => console.log('posts$ change'));
this.purchases$ = store.select(getAllPurchases).do(c => console.log('purchases$ change'));
但是对状态的每一次改变,两个处理程序都在运行。例如,当我添加帖子时,purchases$
处理程序也会运行。
所有的观点是只运行改变的部分,或者我错了?
答
无论何时将动作分派给商店,它都会传递给组合的缩减器并组成新的状态。然后这个新的状态被发射出去。
因此,即使选定的切片状态未发生变化,您的两个可观察值都会看到发射到do
运算符的值。
然而,这是简单的使用distinctUntilChanged
运营商改变这种行为:
import 'rxjs/add/operator/distinctUntilChanged';
this.posts$ = store.select(getAllPosts)
.distinctUntilChanged()
.do(c => console.log('posts$ change'));
distinctUntilChanged
将确保观察到的只有发射时的价值实际上已经改变,因此,如果国家的您选择切片具有没有改变,什么都不会发射。
这不是真的,因为在引擎盖下select方法调用distinctUntilChanged。我也测试过你如何说,而且还是一样的。 – ng2user
是的,你是对的。如果'select'正在通过你认为没有改变的切片,最可能的解释是你对reducer或选择器有问题,切片已经发生了变化。我建议使用'scan'或'buffer'运算符来验证你的状态是否符合你的期望。 – cartant