问题标签 [angular-state-managmement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
150 浏览

angular - @ngrx/data - 在实体数据服务中传递附加参数或使用自定义函数?

我正在尝试使用 ngrx/data 来处理我的一个模型上的 CRUD 操作,但由于它是“嵌套的”,我需要在 getById 方法中传递多个参数。有没有办法在数据服务(扩展默认数据服务)中编写自定义函数,以便可以通过注入到我的组件中的实体服务访问它们?或者,ngrx/data 的接口是否支持任何附加参数?

0 投票
1 回答
242 浏览

javascript - Angular:改变 NGXS 选择器数据正在修改状态而无需操作

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

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

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

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

所以我的问题是

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

javascript - Angular NGXS 不会重新计算选择器,除非所选数据在状态中更新

我的 NGXS 状态定义如下

它是一个非常直接的状态实现。该州默认有2个项目;2 个选择器,一个用于获取所有项目,另一个通过 id 获取,一个用于添加新项目的操作。

我正在使用其中一个组件中的状态,如下所示

我面临的问题是每次我更新状态时(比如向状态添加一个新项目),即使从状态中选择的项目没有改变,通过 id 获取的选择器也会重新触发。

例如,在上面显示的代码中,我选择了带有 id 的项目111。如果我发送一个Add动作来添加一个新项目,选择器getById会重新触发。

NGSX 中是否有任何方法可以定义参数化选择器,仅当所选项目的状态发生变化时才会触发该选择器?

injectContainerState在 NGXS 文档中查看过,但不明白如何将它与这个参数化选择器一起使用。

0 投票
1 回答
75 浏览

angular - 无法在 Angular 中使用 ngrx 获取最新状态值

大家好,我是 Angular 的新手。这些天我正在尝试学习角度的状态管理。好吧,我尝试遵循一些教程,但他们的一些代码已经贬值,所以我有点陷入困境。即使订阅后,我也无法在我的 ts 文件中获得最新的状态值。

//减速器文件

//效果文件

我希望有人可以指导我。我的角度版本是 10.2。

编辑 订阅

Redux 开发工具

//选择器

0 投票
0 回答
64 浏览

javascript - 调用签名返回类型'{放在一边:布尔值;微调器:布尔值;用户:用户;}' 和 'SharedState' 不兼容。角11

我正在学习 Angular11 中的状态管理。当我尝试制作减速器时出现错误。

类型参数 '(state: SharedState, action: { aspect_status: boolean; } & TypedAction<"[ side page ] side"> & { type: "[ side page ] aspect"; }) => { side: boolean; 微调器:布尔值;用户:用户;}' 不能分配给类型为 'OnReducer<SharedState, [ActionCreator<"[side page ] aspect", (props: { aspect_status: boolean; }) => { aspect_status: boolean; } & TypedAction<"[撇开页面]撇开">>]>'。

我试过这样

微调器一正常工作,但抛开错误。

但是当返回类型是任何错误时,不会。我想知道为什么会这样。

0 投票
0 回答
45 浏览

angular - BehaviourSubject 的新值未反映在继承中的 observable 中

我正在构建一个类似于此的角度架构: https ://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/

我只有一个用于管理状态的基类,它管理特定模块的状态:

所以为了管理状态,你只需要简单地扩展这个类

这里感兴趣的方法是 loginUser,正如您在 tap 运算符中看到的那样,它基本上调用 setState 方法,该方法在父级中的 behviourSubject 上调用 .next(),并且显然新值反映给 userInfoattempt$ 可观察的所有订阅者,所以当我在一个组件中注入这个服务并订阅 userInfoattempt$ 时,只要有变化,我就会得到新的值,这工作正常,直到我让另一个服务说 signinService 扩展这个 authService 并且我把登录方法放在那里,

这就是问题发生的地方,这里的 loginUser 方法是相同的,但是当我向组件“注入 authService(不是 signinService)”并订阅 userInfoattempt$ 时,如果我将 signinService 注入组件和订阅 userInfo$ 会反映新值,尽管它们都指向同一个 BehaviourSubject,但我在这里遗漏了什么吗?

0 投票
1 回答
137 浏览

angular - Angular/NGXS - 无法获取商店状态

在我正在调度一个动作的父组件上,我愿意在子组件上获取调度的数组,因为我正在执行以下操作:

list$通常应该返回一个数组,因为我愿意对其元素运行一个 for 循环并过滤一些数据。

到目前为止,我无法在日志中看到数据是从父组件正确分派的,但我无法在子组件上获取/修改它。

0 投票
1 回答
25 浏览

angular - Angular 数据共享架构

我觉得我从根本上误解了 Angular 的一部分,想象一下:

您有一个显示登录用户的导航栏组件,例如:

然后你有一个用户编辑组件,比如:

user$从服务中获得的信息在哪里Observable

现在在应用程序中自然会显示导航栏和其他组件,这意味着两个组件需要相同的数据。为防止多个 api 调用,您可以cachedResponse在. 伟大的!shareReplay()user.service.ts

这是我的问题,以这种方式制作服务需要更多的代码,例如,user直接从service这样的对象共享对象:

在这两个组件中只需添加:
constructor(public userService: UserService) {}
并在模板中使用它,如下所示:

和:

除了不使用 Angular Async Pipe 之外,这样的结构还有什么不好的?
如果您更新名称,所有其他组件也会更新。

我在这里看到了这个问题,但所有答案都不是问题(在我看来)。只是为了回答他们:

  1. 内存泄漏,不,因为 http 服务在 Angular 中取消订阅(我只会将它用于 http 调用)。
  2. Value update is not track,如果你想从同一个 observable 中改变值,这可能是一个问题,但如果你想要那个会产生不同的 observable 。
  3. 关注点分离,拥有一个全局用户对象有什么不好?只有使用 的组件UserService才能访问。
  4. 这种架构并不是真正的问题。

为什么这会很糟糕?或者更确切地说,为什么我没有看到任何人这样做的例子。

0 投票
1 回答
42 浏览

angular - ngrx EntityState.ids.includes() 需要类型为 never 的参数

我有一个带有 ngrx 状态管理的 Ionic Angular 项目。这是我的状态定义:

...

当满足几个特定条件时,我想对状态进行一些更改。首先,我需要检查具有特定 id 的实体是否存储在EntityState.

这是reducer中发生错误的代码:

includes()函数由于某种原因需要一个never类型参数,我不明白为什么。这是我得到的错误:

错误

0 投票
1 回答
30 浏览

angular - NGXS 状态返回对象而不是实际数据

我是 NGXS 的新手。所以只是为了测试,我在简单的测试应用程序上尝试了简单的设置,您使用 导入应用程序组件中的状态forRoot,一切正常。

现在我有一个稍微大一点的应用程序,我找到了forFeature功能状态的功能。所以在我的模块中,我有以下代码:

然后我将模块延迟加载到每个功能的路由模块中,如下所示:

然后这是我的状态类:

我的显示组件上有以下选择:

选择状态上的数据时出现问题。你会注意到我现在已经使用了 any 因为我不知道这里真正返回了什么,但是当我订阅时,myFeature$我可以看到数据并且它也被返回了,但不是只返回数据本身,而是返回像这样:

此外,当我打印以控制台状态快照时,我得到以下信息:

所以当我订阅时会发生这样的额外步骤:

这一切都很好,除了以前我尝试过时forRoot我不必这样做。

此外,当我使用forFeature状态时的其他问题无法自动检测到商店已经有数据,因此即使商店中已经有数据,它也会继续查询后端。我不得不添加一个我认为不理想的 if 语句。同样在我使用它之前,forRoot它可以自动检测,因此应用程序只查询一次后端,并且只在页面加载时查询。

知道为什么会发生这些吗?