关于 NgRx v16 新的 Angular Signals,给出:
export const selectCustomer = (id: string) =>
createSelector(selectCustomers, (customers) => customers[id]);
(常用表达式;取自 Tim Deschryver 的博客文章,介绍如何使用 NgRx 执行此操作,最高版本为 v15)
问题1,当我有
Signal<string>
为id
时,该怎么办?
仅供参考,目前我保持选择器不变并使用 Angular 的
toSignal
/toObservable
,这似乎是一个糟糕的绕道:
import { toSignal, toObservable } from '@angular/core/rxjs-interop'
…
let id: Signal<string>;
…
const customer$ = toSignal(toObservable(id).pipe(
switchMap(id => store.select(selectCustomer(id)))
));
此外,
toObservable
需要注入上下文,因此在代码中使用它存在一些限制。
关于记忆
import * as _ from "lodash";
…
export const selectCustomer = _.memoize((id: string) =>
createSelector(selectCustomers, (customers) => customers[id])
);
问题2,这样手动记忆就变得没有必要了吗?
问题1:
我认为你可以像以前一样(Tim 的 Versin)这样做,并且如果你使用 ngrx v16,则根本不需要互操作包。只需调用信号即可从商店中选择:
customer$ = store.select(selectCustomer(id())
如果您想直接从商店获取信号,只需使用
customer = store.selectSignal(selectCustomer(id())
如果你不能使用 ngrx v16 那么你需要像你一样使用 interop 包。
问题2
为什么要为选择器工厂进行记忆?在您的示例中,所有“源选择器”都已被记忆。因此,如果源选择器之一发出新值并遵循用于返回计算值的 id,则投影仪函数就会被调用。创建的选择器也被记忆,所以我不知道为什么你应该记忆工厂函数。