Обновить состояние NGXS для объекта внутри массива - PullRequest
0 голосов
/ 02 августа 2020

У меня есть состояние 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) {}
  }

Спасибо.

1 Ответ

2 голосов
/ 03 августа 2020

Самый простой способ в NGXS - использовать Операторы состояния - в данном случае предоставленный оператор 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)
        })
     );
   }
}
...