@ ngrx / store订阅商店的一部分,避免检测到其他部分的更改

时间:2016-07-14 09:44:57

标签: angular rxjs ngrx

背景

我商店中的一个缩减器处理应用程序中选择的内容。这个商店的界面(我们称之为app)可能如下所示:

interface IApp {
    selectedProject: IProject;
    selectedPart: IPart;
}

所以我希望订阅仅在不同的项目时执行操作。被选中。我写了这样的话:

this.store.select('app')
    .map((store: IApp) => store.selectedProject)
    .subscribe((project: IProject) => {
        // Stuff happens here
    });

selectedProject发生变化时,此功能会执行此操作。但是,当selectedPart更改时,它也会执行此操作。很明显,无论地图如何,它都会监听整个app商店。这是有道理的。

问题

我不希望这种情况发生。我只希望在selectedProject更改时执行我的函数。

我知道我可以将selectedProjectselectedPart分成不同的商店来解决这个问题。但是,我很快就能找到许多商店。也许这就是它的意思?

还有另一种方法吗?我可以使用此界面保留商店,并且订阅仅检测商店selectedProject部分的更改吗?

1 个答案:

答案 0 :(得分:9)

我相信您正在寻找distinctKeyUntilChanged

this.store.select('app')
  //Only emit when selectedProject has changed
  .distinctUntilKeyChanged(
    //Key to filter on
    'selectedProject',
    //Optional comparison function if you have a specific way of comparing keys 
    (x, y) => x.projectName === y.projectName)
  .pluck('selectedProject')
  .subscribe((project: IProject) => {});