我的 NGXS 状态定义如下
export interface Project{
_id:string,
name:string
}
export class ProjectStateModel {
projects: Project[];
}
@State<ProjectStateModel>({
name: 'Projects',
defaults: {
projects: [{_id:'111', name:'Project 1'}, {_id:'222', name: 'Project 2'}]
}
})
@Selector()
static getAll(state: ProjectStateModel) {
return state.projects;
}
@Selector()
static getById(state: ProjectStateModel) {
return (id) => {
return state.projects.find(p => p._id === id);
};
}
@Action(ProjectsAction.Add)
add({ getState, patchState }: StateContext<ProjectStateModel>, { payload }: ProjectsAction.Add)
{
const state = getState();
patchState({
projects: [...state.projects, ...payload]
})
}
它是一个非常直接的状态实现。该州默认有2个项目;2 个选择器,一个用于获取所有项目,另一个通过 id 获取,一个用于添加新项目的操作。
我正在使用其中一个组件中的状态,如下所示
export class ProjectDetailComponent{
selectedPROJ: Project;
selectedPROJ$: Observable<Project>;
constructor(){
this.selectedPROJ$ = this.store.select(ProjectState.getById)
.pipe(map(filterFn => filterFn('111')));
this.test = this.selectedPROJ$.subscribe(p => {
console.log(p); //this get logged every time there is a change in state even though the project 111 hasn't changed
})
}
}
我面临的问题是每次我更新状态时(比如向状态添加一个新项目),即使从状态中选择的项目没有改变,通过 id 获取的选择器也会重新触发。
例如,在上面显示的代码中,我选择了带有 id 的项目111
。如果我发送一个Add
动作来添加一个新项目,选择器getById
会重新触发。
NGSX 中是否有任何方法可以定义参数化选择器,仅当所选项目的状态发生变化时才会触发该选择器?
我injectContainerState
在 NGXS 文档中查看过,但不明白如何将它与这个参数化选择器一起使用。