状态基类中记忆选择器的指南



我有一个关于NGXS存储和在状态类层次结构中使用记忆@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 文档

最新更新