Angular 2 - ngrx订阅在每个状态更改上运行

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将确保观察到的只有发射时的价值实际上已经改变,因此,如果国家的您选择切片具有没有改变,什么都不会发射。

+2

这不是真的,因为在引擎盖下select方法调用distinctUntilChanged。我也测试过你如何说,而且还是一样的。 – ng2user

+0

是的,你是对的。如果'select'正在通过你认为没有改变的切片,最可能的解释是你对reducer或选择器有问题,切片已经发生了变化。我建议使用'scan'或'buffer'运算符来验证你的状态是否符合你的期望。 – cartant