ngxs - 状态基类中内存选择器的指南

标签 ngxs

我对 NGXS Store 以及状态类层次结构中记忆化的 @Selector() 的使用有疑问。

解决下述问题的建议方法是什么? NGXS 商店文档没有提供这方面的指南/建议。

鉴于此示例状态设置,

<小时/>
export interface BaseModel { data: string[]; }

// base class not a state!
export class BaseState {
  @Selector()
  static dataSelect(state: BaseModel) { return state.data; }

  // ...
}
<小时/>
export interface DerivedModel extends BaseModel {}

@State<DerivedModel>({ name: 'derived'; })
export class DerivedState extends BaseState {
  // ...
}   
<小时/>
export interface UsingModel { thing: number; }

@State<UsingModel>({ name: 'using'; })
export class UsingState implements NgxsOnInit {

  constructor(private _store: Store) {}

  ngxsOnInit(ctx: StateContext<UsingModel>) {
    // have this state update when derived state changes
    this._store.select(DerivedState.dataSelect).subscribe(data => console.log(data));
  }

  // ...
}
<小时/>

当让这段代码运行时,它将打印出 undefined 因为 state 参数 dataSelect(...) 方法的属性将不会被设置。

我跟踪了 BaseState 不是 NGXS 状态并因此缺少内部 NGXS_META 的原因 属性,这又会导致 undefined 参数。 将 BaseState 添加到选择器(例如 @Selector([BaseState]))以强制状态仍为 包含也没有达到预期的效果,因为现在 NGXS 无法导航到匹配的状态切片。

我找到了两种方法可以使这项工作按预期进行: 1. 在每个派生状态实现中复制 @Selector(...) 方法。但这违背了最初设计状态类层次结构的原因。 2. 使用类似 @DerivedSelector(...) 的东西,它根据标准装饰器工作,但动态创建用于每个遇到的派生状态类的选择器。

谢谢。

最佳答案

据我所知,这不能使用 @Selector 注释来实现,而是使用 createSelector() 来实现。

export class BaseState {
  static dataSelect() {
    return createSelector(
      [this],
      (state: BaseModel) => {
        return state.data;
      }
    );
  }

  //...
}

如果你像这样改变你的基本状态,你的代码就会工作。详情请参阅NGXS docs

关于ngxs - 状态基类中内存选择器的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52308189/

相关文章:

angular - 使用 NGXS 订阅操作流的更简洁方式

angular - 在同一可观察对象上多次使用 `async` 管道

Angular 5 : NGXS & route resolvers

angular - 当一个 Action 被调度时做一些事情

angular - 如何在不重复存储对象的情况下在多个状态模型之间进行交互 - NGXS

ngxs - 在 "export ' 中找不到 '@ngxs/store' StateContext' 的 NXGS 警告

redux - NGXS是否像redux-undo一样支持undo

ngxs - 空注入(inject)器错误: No provider for ActivatedRouteSnapshot

angular - NGXS:测试调度 Action 不适用于 ofActionDispatched

javascript - 是否应该在生产版本中删除 NGXS NgxsLoggerPluginModule?