我很难找到在ngrx应用程序中改变状态的正确方法,因为状态相当复杂且取决于许多因素。这个问题不是关于如何正确地编写一个代码,而是关于如何设计这样一个软件的更多内容,在找到一些hacky解决方案和解决方法时应该做些什么和不应该做什么。
应用程序'随着时间的推移'进化'我不想以抽象的方式分享这个过程,以明确我的观点:
第1阶段
州包含实体。它们代表树中的节点并通过ID链接。修改或添加实体需要检查新/已修改的节点应该连接的节点类型。也可能是在修改节点时,必须更新其他节点。
解决方案是:创建完成工作的功能。在reducer中调用它们所以一切都是最新的并且在使用时同步(有些服务可能会修改状态)。
第2阶段
将配置添加到对修改/创建自动修改节点的方式有影响的状态。此配置在根状态下保存在自己的状态中。
解决方案:
1)修改操作以从配置中获取所需数据。
2)修改创建/调度动作的位置(添加一些丑陋的
this.state.select(fromRoot.getX)
.first()
.(subscribe(element => {this.state.dispatch(new Action({...old_payload, newPayload: element}))})
围绕调度调用包装
3)修改执行节点修改的函数和
4)将参数传递添加到reducer
中的函数调用第3阶段
现在我要求再次为流程添加另一个配置,也由后端重新启动,并保存在根状态下的另一个状态
现在状态如下:root
|__nodes
|__config_1
|__config_2
我正准备在第2阶段重复这些步骤,但是所有传入的数据和函数都必须携带大量数据。当我实际上在包含所有需要信息的状态上发布动作时,这似乎是错误的。
我该如何处理这个问题?
有些想法已经有了:
使用效果:它们能够从他们需要的状态获取所有内容并且可以创建所有内容 - 因此我只需要仅使用动作有效负载调度动作,然后效果可以从所需的状态获取所有内容。我不喜欢这个想法,因为它会触发异步任务来修改状态并添加非状态更改操作。
使用服务:服务保持状态与效果非常相似,但不使用动作来创建异步调用,然后调度可以重新改变状态的动作。
完成组件的所有操作:目前组件在更改状态时保持非常简单,因为我更喜欢操作尽可能少地携带数据,因为reducer可以访问状态以获取数据 - 但这就是问题所在,这次我无法掌握所需的数据。