1

我使用 NGXS 作为我的状态管理库。我有一个用户状态和一个选择器来获取用户列表。我还有一个要更新用户名的组件。我想要这样做的方法是复制从选择器 observable 获得的用户列表,并将 ngModel 与输入一起使用。

这是我想要实现的一个例子

还有我的状态选择器的片段

@Selector()
static getAll(state: User[]) {
   return [...state];
}

问题是修改从选择器接收到的数据正在修改实际状态,即使没有调度操作。我理解它是因为我正在改变我直接从状态中获得的对象,但选择器不应该是只读的吗?

所以我的问题是

  1. 我认为选择器应该是只读的,不能以任何方式修改状态。他们不是吗?
  2. 即使将选择器更改为return state.map(user=>Object.assign({}, user))不起作用。是定义选择器的正确方法吗?
  3. 还是我完全错过了如何使用选择器的东西?
4

1 回答 1

1

要回答您的问题:

  1. 我认为选择器应该是只读的,不能以任何方式修改状态。他们不是吗?

选择器应该保持不可变,但 NGXS 中没有任何东西真正强制执行这一点。所以,不,他们不是。如果您选择这样做,则由您决定保持它不可变。

  1. 即使将选择器更改为 return state.map(user=>Object.assign({}, user)) 也不起作用。是定义选择器的正确方法吗?

什么不起作用?

  1. 还是我完全错过了如何使用选择器的东西?

可能不是。

似乎您认为从选择器返回的任何内容都是只读的……不是。在开发模式下,它会抱怨并说它是只读的,但在生产中,它会让你改变你的内心。我的怀疑是你正在改变你的选择器在你的组件中返回的内容,或者只是“上游”(就像在另一个选择器中一样)。

因此,我只是在 stackblitz 中查看了您的示例。您确实在使用双向数据绑定进行变异:[(ngModel)]="user.name". 你需要解决这个问题。

于 2021-03-10T17:08:49.557 回答