Когда список категорий станет доступным в магазине A, выберите одну категорию и установите ее идентификатор в магазине B

У меня есть два магазина - GroupsStore и ItemsFilterStore. Состояние ItemsFilterStore должно содержать выбор одной группы из групп, доступных в GroupsStore, но:

  • группы изначально недоступны в GroupsStore, поэтому выбор в ItemsFilterStore не может быть изначально сделан (конструктор инициализирует его как ноль).

  • как только группы станут доступны в GroupStore, мне нужно выполнить действие, которое выберет одну группу (согласно некоторой логике) и установит ее ID в ItemsFilterStore.

ЭТА ПРОБЛЕМА:

Я читал ВЕЗДЕ, что запуск действий из обработчиков действий в магазине является антипаттерном.

Так как мне правильно это спроектировать?

1 ответ

Ну, я придумал 2 возможных способа решения этого дела. Просто для ясности, скажем, у вас есть действие getGroups это вызывает запрос к источнику. Когда запрос успешен, он запускает действие resultsRecieved, который GroupsStore ручки.

1) Вы можете слушать resultsRecieved действие в обоих магазинах и обработать результаты, чтобы обновить ItemsFilterStore, Но в этом случае вам может понадобиться извлечь логику выбора группы из GroupsStore в некоторый служебный файл, который можно импортировать и использовать в обоих хранилищах, если это возможно.

2) Вы можете слушать getGroups Акция в обоих магазинах. в ItemsFilterStore В качестве обработчика этого действия вы можете использовать метод ожидания Alt, который сигнализирует о том, что это хранилище зависит от другого хранилища своих данных, и должно ожидать его обновления. Так что обработчик getGroups в ItemsFilterStore может выглядеть примерно так:

getGroups() {
    this.waitFor(GroupsStore);
    var groups = GroupsStore.getState().groups;
}

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

Другие вопросы по тегам