5

背景

我商店中的一个减速器处理在应用程序中选择的东西。该商店的界面(我们称之为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商店部分更改的订阅吗?

4

1 回答 1

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) => {});
于 2016-07-14T16:15:06.637 回答