从状态中抽象选择器和动作处理程序

Posted

技术标签:

【中文标题】从状态中抽象选择器和动作处理程序【英文标题】:Abstracting selectors and action handlers from state 【发布时间】:2019-02-01 20:33:30 【问题描述】:

我想知道是否可以将@State 类中的@Selectors 和/或@Action 处理程序抽象到一个单独的文件中?随着状态越来越大并且选择器越来越复杂,我想将它们移动到一个单独的文件中以保持状态类更干净。在 NGXS 中有没有办法做到这一点?

编辑:为了以后参考,我在NGXS slack频道上得到了答案,确实是可以的。我们可以创建一个单独的选择器类来存储我们所有的选择器,并将感兴趣的状态作为参数传递给它们。

export class EntityStateSelectors 
  @Selector([EntityState])
  thing(state: EntityStateModel) 
    return state.thing;
  

到目前为止,我还没有弄清楚如何为动作处理程序做同样的事情,但是将选择器提取到一个单独的文件中已经清理了很多状态类!

【问题讨论】:

也许你需要更多的状态和/或子状态? 感谢您的输入,但这不是我的意思 - 我已经有一个复杂的应用程序结构,有多个子状态。我还有很多选择器和操作处理程序,为了保持干净的应用程序结构,我想将它们拆分为单独的文件(如在 ngrx 中,这是我来自的模式)。这是可能的!检查我更新的问题。 在这种情况下,您如何处理在父->子关系之间创建循环引用? @Ale 我使用相同的模式将选择器与动作处理程序分开,但很难使其与angular9.1 + ngxs3.6 一起使用。我在应用程序初始化时遇到运行时错误,例如使用选择器的Cannot read property 'NGXS_SELECTOR_META' of undefined。有什么提示吗? @bertrandg 谢谢伙计,我们已经修复了它,不得不重构数据结构,所以依赖是一种方式。 【参考方案1】:

您可以为您的选择器创建一个单独的文件,强烈建议您使用。你可以创建一个像app.selectors.ts 这样的文件:

export class AppSelectors 

  @Selector([AppState])
  static viewModel(state: AppStateModel) 
    // your selector logic here
  


然后你就可以像这样在你的组件中正常使用了:

@Component(...)
export class AppComponent 
  @Select(AppSelectors.viewModel) vm$: Observable<ViewModel>;

这大大减小了app.state.ts 文件的大小,因为它只留下了动作处理程序。此外,这使您的代码更容易测试,因为您的选择器只是纯函数

【讨论】:

是的,如果你看到我不久前用你在这里的建议更新了我的问题:)

以上是关于从状态中抽象选择器和动作处理程序的主要内容,如果未能解决你的问题,请参考以下文章

05-说下类加载器和双亲委派机制

Android 图像选择器和裁剪器

Ext JS 4 - 理解 this.control、选择器和事件处理

jQuery的选择器

引导日期选择器和引导验证器

使用日期选择器和时刻处理不同语言的日期