如何将角度信号值传递给 NgRx 选择器

问题描述 投票:0回答:2

关于 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,这样手动记忆就变得没有必要了吗?

ngrx ngrx-store
2个回答
1
投票

问题1:

我认为你可以像以前一样(Tim 的 Versin)这样做,并且如果你使用 ngrx v16,则根本不需要互操作包。只需调用信号即可从商店中选择:

customer$ = store.select(selectCustomer(id())

如果您想直接从商店获取信号,只需使用

customer = store.selectSignal(selectCustomer(id())

如果你不能使用 ngrx v16 那么你需要像你一样使用 interop 包。

问题2

为什么要为选择器工厂进行记忆?在您的示例中,所有“源选择器”都已被记忆。因此,如果源选择器之一发出新值并遵循用于返回计算值的 id,则投影仪函数就会被调用。创建的选择器也被记忆,所以我不知道为什么你应该记忆工厂函数。


© www.soinside.com 2019 - 2024. All rights reserved.