Angular NGRX商店选择器的正确使用

Angular NGRX商店选择器的正确使用,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我在应用程序中使用Ngrx来存储状态。 假设我的商店有两个项目itemA和itemB。 我的componentX对itemA中的更改做出反应,并触发一个函数,该函数进一步执行一些更复杂的计算,这需要itemB的当前值 ComponentX { pi = 3.15; date = new Date(); constructor(private appStore: Store<AppState>){} ngOnInit() { this.

我在应用程序中使用Ngrx来存储状态。 假设我的商店有两个项目itemA和itemB。 我的componentX对itemA中的更改做出反应,并触发一个函数,该函数进一步执行一些更复杂的计算,这需要itemB的当前值

ComponentX {
    pi = 3.15;
    date = new Date();
    constructor(private appStore: Store<AppState>){}
    ngOnInit() {
         this.appstore.select(selectItemA).subscribe(
             (itemA) => someComplexFunction(itemA)
         )
    }
    someComplexFunction(itemA) {
        /* Requires itemB */
    }
}
然而,componentX并不关心itemB何时更改,它只需要itemA更改时itemB的当前值。我无法从我的状态中删除itemB,因为其他组件需要它。 在这种情况下,编写选择器的正确方法是什么。

您可以使用withLatestFrom运算符

类似于withLatestFromthis.appstore.SelectItemB的内容将为您提供B

看一看这个例子,在这个例子中,同样的事情实际上是这样做的:

原理与withLatestFrom运算符相同

类似于withLatestFromthis.appstore.SelectItemB的内容将为您提供B

看一看这个例子,在这个例子中,同样的事情实际上是这样做的:


原理是一样的

您可以订阅itemA selector,然后使用itemB selector的Latest通过,或者您可以为我们提供有关某个复杂功能的更多信息吗?它是纯功能还是有副作用?如果它是纯函数,那么你应该完全为它编写另一个选择器。@maxime1992:它不是纯函数Dee zg answer是正确的。你可以订阅itemA selector,并使用itemB selector的最新版本来完成它。你能给我们一些关于某个复杂函数的更多信息吗?它是纯功能还是有副作用?如果它是纯函数,那么您应该为它完全编写另一个选择器。@maxime1992:它不是纯函数Dee zg answer是正确的。下面的代码是为val this.appstore.selectselectItemA.pipewithLatestFromselectItemB.subscribeval=>console.logvalI意识到错误,使它现在可以工作。感谢您的帮助,下面的代码是为val this.appstore.selectselectItemA.pipewithlatest fromselectitemb.subscribebeval=>console.logvalI意识到错误,使其立即工作。谢谢你的帮助