更新数组内对象的 NGXS 状态
Update NGXS state for an object inside array
我将 NGXS 状态定义为数组。
interface Sample {
name: string;
age: number;
}
@State<Sample[]>({
name: 'samples',
defaults: [] as Sample[]
})
@Injectable()
export class SampleState {
}
现在假设我的现有状态为 [{name:'abc', age: 1}, {name: 'def', age:2}]
我如何添加一个操作来根据名称修改样本的年龄并更新状态。
如果它是一个对象,我可以使用简单的 patchState,但这里的状态是一个数组,所以我不确定。
@Action(SampleActions.UpdateAge)
updateAge(context: StateContext<Sample[]>, action: SampleActions.UpdateAge): void {
}
这是我在 SampleActions 中定义的动作
export class UpdateAge{
static readonly type = '[Sample] Update Age';
constructor(public name: string, public age: number) {}
}
谢谢。
NGXS 中最简单的方法是使用 State Operators - 在本例中,使用提供的 updateItem
运算符。
例如稍微重构一下状态模型
interface SamplesStateModel {
samples: Sample[];
}
@State<SamplesStateModel>({
name: 'samples'
}
)
export class SamplesState {
@Action(SampleActions.UpdateAge)
updateAge(context: StateContext<Sample[]>, action: SampleActions.UpdateAge): void {
const updatedSample: Sample = { name: action.name, age: action.age };
ctx.setState(
patch({
samples: updateItem<Sample>(sample => sample.name === action.name, updateSample)
})
);
}
}
我将 NGXS 状态定义为数组。
interface Sample {
name: string;
age: number;
}
@State<Sample[]>({
name: 'samples',
defaults: [] as Sample[]
})
@Injectable()
export class SampleState {
}
现在假设我的现有状态为 [{name:'abc', age: 1}, {name: 'def', age:2}]
我如何添加一个操作来根据名称修改样本的年龄并更新状态。 如果它是一个对象,我可以使用简单的 patchState,但这里的状态是一个数组,所以我不确定。
@Action(SampleActions.UpdateAge)
updateAge(context: StateContext<Sample[]>, action: SampleActions.UpdateAge): void {
}
这是我在 SampleActions 中定义的动作
export class UpdateAge{
static readonly type = '[Sample] Update Age';
constructor(public name: string, public age: number) {}
}
谢谢。
NGXS 中最简单的方法是使用 State Operators - 在本例中,使用提供的 updateItem
运算符。
例如稍微重构一下状态模型
interface SamplesStateModel {
samples: Sample[];
}
@State<SamplesStateModel>({
name: 'samples'
}
)
export class SamplesState {
@Action(SampleActions.UpdateAge)
updateAge(context: StateContext<Sample[]>, action: SampleActions.UpdateAge): void {
const updatedSample: Sample = { name: action.name, age: action.age };
ctx.setState(
patch({
samples: updateItem<Sample>(sample => sample.name === action.name, updateSample)
})
);
}
}