NGXS: Можем ли мы разделить объект из массива на подсостояние? - PullRequest
0 голосов
/ 09 января 2020

Моя модель состояния верхнего уровня выглядит следующим образом:

{
    listOfItems: [],    // Item[]
    selections: {
        itemId: 0
    }
}

Список товаров может содержать 10 различных товаров. Когда пользователь нажимает на элемент, он обновляет выбор, и мой @Selector будет перезапущен.

Действие: Установить выбор элемента

  @Action(Item.Select)
  setState(
    { setState }: StateContext<ItemsModel>,
    { itemId }: Item.Select
  ) {
    setState(patch({ selections: patch({ itemId }) }));
  }

Селектор: Выберите текущий элемент

@Selector()
static getSelectedItem(state: ItemModel): Item {
    return state.itemList.find(i => i.itemId === state.selections.itemId);
}

Проблема в : у меня есть до 20 действий для выполнения выбранного элемента. В результате:

  1. Множество .find() поисков для поиска элемента в исходном массиве (как селектора, так и действий)
  2. Действия, выполняемые на listOfItems, совпадают поместите как те, что нужно выполнить для указанного c Item

Я хотел бы : сохранить массив и выбор в этом состоянии, но отделить «выбранный элемент» на новое подсостояние, где моделью дочернего состояния может быть просто тип элемента. Таким образом, я могу инкапсулировать все действия над Item в другом месте, чем действия над массивом Items [].

Я не уверен, как их синхронизировать c. Мне нужно поддерживать состояние «selectedItem» в актуальном состоянии при изменении itemId выбора в родительском элементе. Мне также нужно убедиться, что любые мутации в selectedItem отражены в исходном массиве в родительском.

1 Ответ

0 голосов
/ 13 января 2020

Похоже, что это может быть более фундаментальная проблема с тем, как вы пытаетесь представить состояние вашего приложения. Думали ли вы о нормализации вашего списка предметов? Или, по крайней мере, использовать объект поиска ключа / значения вместо массива? Вам не нужно было бы использовать .find () для поиска и получить доступ к ключу объекта через уникальный идентификатор, который вас интересует. Дайте мне знать, если это поможет!

...