使用 ngrx 在 Angular 项目中从单独状态解析用户名时出现问题

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

我正在使用 ngrx 开发一个 Angular 项目,其中我有两种状态 - 一种用于用户,另一种用于项目。在项目状态下,每个项目都有一个作者和一个编辑。用户状态包含作为键值对象的用户,仅从后端获取键。我已经在另一个状态加载了用户数据。

我正在尝试使用用户状态来解析项目减速器中的用户名称,但我当前的实现不起作用。这是代码:

在用户选择器中:

export const getUserNameByIdSelector = (ids: number) => createSelector(
selectPeople, (state: PeopleState) => state.users.find(user => ids === user.Id).Name);

在项目减速器中:

case ActionTypes.LoadAllProjectsSuccess: {
let projects = action.payload;
projects.map(p => ({
    ...p,
    Author: { ...p.Author, Value: getUserNameByIdSelector(p.Author.Key as number) },
    Editor: { ...p.Editor, Value: getUserNameByIdSelector(p.Editor.Key as number) }
}));
return {
    ...state,
    projects: projects
};}

我遇到了此代码的问题,并且名称未正确解析。关于如何解决这个问题有什么想法吗?

angular ngrx selector reduce
1个回答
0
投票

您的主要问题是您直接调用

getUserNameByIdSelector
而不将其作为参数传递到存储选择函数中。你不会得到你期望的值,因为
getUserNameByIdSelector
的返回类型是
MemoizedSelector
,而不是值。

话虽这么说,据我所知,确实没有什么好方法可以在减速器中调用选择器。我将其称为反模式。

您可以做的是使用效果中所需的数据来调用您的操作,但这对我来说也有点老套。

或者,您可能需要考虑重构您的状态,以便在单个状态切片中拥有彼此相关的所有数据。

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