Оператор состояния NGXS updateItem

#ngxs

#ngxs

Вопрос:

Я пытаюсь использовать операторы состояния NGXS внутри моего приложения, но у меня возникли проблемы с поиском хороших примеров того, как их использовать для немного более сложных обновлений.

Например, в документации NGXS показан пример обновления этого состояния:

 @State<AnimalsStateModel>({
  name: 'animals',
  defaults: {
    zebras: ['Jimmy', 'Jake', 'Alan'],
    pandas: ['Michael', 'John']
  }
})
  

Чтобы изменить имена одной из pandas, он использует оператор состояния NGXS «updateItem», подобный этому:

 @Action(ChangePandaName)
  changePandaName(ctx: StateContext<AnimalsStateModel>, { payload }: ChangePandaName) {
    ctx.setState(
      patch({
        pandas: updateItem(name => name === payload.name, payload.newName)
      })
    );
  }
  

В этом примере функция updateItem использует лямбда-выражение в своем первом параметре для поиска правильного объекта в массиве и заменяет его на с объектом во втором параметре.

Как бы вы сделали это с массивом, содержащим сложные объекты, из которых вы хотели изменить значение только одного свойства? Например, что, если бы мое состояние было таким:

 @State<AnimalsStateModel>({
      name: 'animals',
      defaults: {
        zebras: [{1, 'Jimmy'} , {2, 'Jake'}, {3, 'Alan'}],
        pandas: [{1, 'Michael'}, {2, 'John'}]
      }
    })
  

Как бы я использовал функцию updateItem, чтобы найти правильное животное по идентификатору, а затем обновить имя?

Ответ №1:

Приведенный вами пример состояния по умолчанию имеет недопустимый синтаксис, но я думаю, что я понял, что вы намеревались предоставить. Что-то вроде этого:

 @State<AnimalsStateModel>({
  name: 'animals',
  defaults: {
    zebras: [{id: 1, name: 'Jimmy'} , {id: 2, name: 'Jake'}, {id: 3, name: 'Alan'}],
    pandas: [{id: 1, name: 'Michael'}, {id: 2, name: 'John'}]
  }
})
  

updateItem также принимает оператор состояния в качестве второго параметра, чтобы вы могли снова использовать patch оператор для изменения элемента. Тогда ваше действие будет выглядеть следующим образом:

 @Action(ChangePandaName)
changePandaName(ctx: StateContext<AnimalsStateModel>, { payload }: ChangePandaName) {
  ctx.setState(
    patch({
      pandas: updateItem(item=> item.id === payload.id, patch({ name: payload.newName }))
    })
  );
}