Каков наилучший способ разбить состояние NGXS на более мелкие обслуживаемые части, но оставить их доступными друг для друга? - PullRequest
0 голосов
/ 01 мая 2020

Краткая история вопроса:

Я занимаюсь разработкой веб-помощника для партийной игры Mafia , поэтому цель состоит в том, чтобы хранить одну игру в NGXS. Вот репозиторий gitlab

Игра содержит:

  1. Список игроков
  2. Список пройденных дней (от 0 до примерно 5 (обычно) )

Модель игрока

Каждый день состоит из трех этапов: Ночь> День> Голосование

Модель дня

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

На самом деле мне удалось как-то решить ее, прочитав это: https://github.com/ngxs/store/issues/632

Я создал CurrentDayState и PlayersState как ребенок утверждает, но в этом случае это кажется плохим подходом, потому что так:

  • Я могу получить доступ только к состоянию напрямую, а селекторы со сложной логикой c на данный момент недоступен.
  • Я сохраняю только текущий день и текущий голос, а затем помещаю их в массив дней в GameState, и будет трудно реализовать возврат к предыдущим дням, если хозяин игры мне нужно будет проверить некоторую информацию

Мне кажется, что мой подход немного неуклюж, и я не смог найти лучшего решения. Я мог бы хранить все действия в root GameState, но таким образом файл .ts займет около 800 строк, и это кажется мне плохой идеей.


Вопрос:

Есть ли способ сделать состояние NGXS модульным, но позволить каждой его части обращаться к селекторам из другой части, не сталкиваясь с проблемой циклической зависимости? (Читая уже означавшую проблему, предполагается, что подсостояния NGXS не зависят друг от друга и не должны иметь никакого контроля друг над другом)

1 Ответ

0 голосов
/ 01 мая 2020

Один из подходов к этому - рассматривать каждое хранилище как таблицу базы данных, а каждое новое состояние, которое вы записываете как новую запись / строку в таблице. Нормализуя ваши модели, вы можете иметь магазин плеера и дневной магазин. Если вам нужна вся история дней и состояний игроков за определенный день, вы можете постоянно вставлять новые состояния, а не обновлять текущие состояния. Игрокам может понадобиться атрибут для указания времени данного состояния (например, внешний ключ, указывающий на ассоциированное состояние дня).

Могут быть записаны селекторы для выбора текущего состояния или поиска данного состояния в течение заданного времени. в истории игры, если это требование бизнеса. В документации ngxs по селекторам упоминается объединение несвязанных состояний с мета-селекторами . Вы можете рассмотреть возможность использования этих селекторов, чтобы объединить соответствующего игрока и состояние дня для заданной потребности поиска.

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

По конкретному c вопросу о поддержании разных состояний без циклической зависимости следует избегать импорта двух файлов друг в друга. Два способа справиться с этой задачей:

  1. Подумайте, где вам нужно объединить состояния - выберите один в качестве основы для основного бизнес-объекта - и импортируйте файлы только одним способом в это состояние.

  2. Если ни одно из состояний не является основанием для основного бизнес-объекта, введите третье состояние, которое выполняет эту роль, и импортируйте в него другие состояния.

Затем используйте мета-селектор, предоставленный NGXS, и присоединитесь к соответствующим состояниям там.

например.

export class DaysState{
  @Selector([DaysState, PlayersState])
  static getGameState(days, players) {
    return [...days, ...players];
  }
}
...