背景
我商店中的一个缩减器处理应用程序中选择的内容。这个商店的界面(我们称之为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
更改时执行我的函数。
我知道我可以将selectedProject
和selectedPart
分成不同的商店来解决这个问题。但是,我很快就能找到许多商店。也许这就是它的意思?
还有另一种方法吗?我可以使用此界面保留商店,并且订阅仅检测商店selectedProject
部分的更改吗?
答案 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) => {});