angular - 使用 ngrx 处理复杂模型
问题描述
我有兴趣在我的应用程序中实现 ngrx 框架,但我对真正涉及的工作量有些担心。这是我正在使用的模型,您可以看到公会模型本质上只是玩家的集合。我有建立公会的计划,但现在还很空洞。Player Model由一些属性和一组 Skills 组成,每个 Skill 都有 SkillRule。
{
GuildName: "Guild",
Players:[{
PlayerName: "Player A",
PlayerId: 1,
AttackType: "Melee",
Skills:[{
SkillName: "Heal Self",
SkillType: "Magic",
SkillRules:{
RuleType:"HealRule",
Cost: 100,
FailChance:10
Boost: false
}
}]
}]
}
{
PlayerName: "Player A",
PlayerId: 1,
AttackType: "Melee",
Skills:[{
SkillName: "Heal Self",
SkillType: "Magic",
SkillRules:{
RuleType:"HealRule",
Cost: 100,
FailChance:10
Boost: false
}
}]
}
这些值都是通过各种 UI 元素设置的,例如文本字段、下拉菜单、单选按钮等。
我感兴趣的是利用 NGRX 来管理公会状态和玩家状态。两者在应用程序中被分开处理,因为玩家可以被认为是“单人”;公会 [] 和玩家 []。
我的问题是(希望这是有道理的),状态管理需要涉及到这些模型的深度吗?例如,我是否需要动作/选择器/效果让用户与所有不同的属性进行交互?如果用户想要更新玩家的 AttackType 或 SkillRules,是否需要动作/效果?
我的想法是使用商店来管理顶层的两个集合,我的组件将从商店中获取对象并将它们呈现给用户。我可能至少需要对 UPDATE_GUILD 和 UPDATE_PLAYER 采取行动。
解决方案
准确地说,您需要 NgRx 中的 Effects 来更改请求的异步部分,您希望在对存储进行最终更改之前处理来自服务器的一些数据。
你的问题:
例如,我是否需要动作/选择器/效果让用户与所有不同的属性进行交互?
答案不一定适用于所有人。您肯定需要 Actions 来调用 Reducer,这将改变您的应用程序 同步数据,例如,如果您更改了单击链接上的路由,这是一个简单的案例,不需要 Effect,只需 Reducer 就可以了.
但是在这两种情况下,您都需要使用 Action 来调度调用并执行该操作。
需要选择器来回读值,因此如果您需要读取值,则必须为其创建选择器。如果您不需要价值,请不要创造价值。
如果您有一个操作,例如 getUserAccount 信息,它是异步请求的操作,则需要效果,一旦在效果中处理了该信息,那么效果将向 Reducer 分派一个操作,以将从服务器接收到的最终响应提交到状态。
解决方案是您需要了解进行状态更改的确切要求,并确定请求是同步的还是异步的。