Лучшая практика в отношении StateManager в Ember.js

StateManager в Ember.js еще не так хорошо документировано, поэтому у меня есть несколько вопросов относительно его использования.

  1. Нужно ли стремиться позвонить .goToState только изнутри государственного управляющего?
  2. Я иногда обнаруживаю методы зеркалирования в менеджере состояний, например save: -> StateManager.send("save"), Это имеет смысл или я что-то упустил?
  3. Должны ли все модификации моделей (как правило) проходить через государственного менеджера?
  4. Если одно представление имеет разные состояния, должно ли это моделироваться с использованием ViewState с дочерними состояниями, или я должен использовать вычисленные свойства и свойства представления, чтобы хранить эту информацию только в представлении (без того, чтобы менеджер состояний не знал о внутреннем состоянии представлений)? *

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

Ссылка на Github: https://github.com/emberjs/ember.js/tree/master/packages/ember-states/lib

2 ответа

Решение

Стоит ли стремиться к вызову.goToState только из государственного менеджера?

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

Иногда я обнаруживаю методы зеркального отображения в менеджере состояний в представлении, например save: -> StateManager.send("save"). Это имеет смысл или я что-то упустил?

Мне нравится, что Пангратц говорит по этому поводу.

Должны ли все модификации моделей (как правило) проходить через государственного менеджера?

То, как я использую диаграммы состояний, нет. Однако я видел, как некоторые люди используют диаграммы состояний в качестве полной замены слоя контроллера, и если вы работаете именно так, тогда да, это должно пройти через менеджер состояний. Шаблон заключается в том, чтобы избежать прямого манипулирования моделями из представлений; будь то уровень контроллера или менеджер состояний между ними, кажется мне спорным вопросом.

Однако, как я использую диаграммы состояний, менеджер состояний предназначен для управления состоянием приложения. Он может воспроизводить диспетчер трафика для модификации моделей, если эта модификация изменит состояние приложения (например, если есть индикатор прогресса, когда обновление завершено), но мне кажется, что обновления модели не являются частью его мандата; они принадлежат контролерам.

Если одно представление имеет разные состояния, должно ли это моделироваться с использованием ViewState с дочерними состояниями, или я должен использовать вычисляемые свойства и свойства представления, чтобы хранить эту информацию только в представлении (без того, чтобы менеджер состояний знал о внутреннем состоянии представлений)?

Я думаю, что управляющий штата должен знать (или должен знать) внутреннее состояние представления.

Из любопытства вы пришли из области веб-разработки или из области разработки приложений для настольных компьютеров и мобильных приложений? Я пришел из веб-разработки, и государственные графики стали для меня новой концепцией. Мне было очень полезно прочитать каноническую статью Государственной диаграммы Дэвида Харела ("PDF-файл!"). Он удивительно читабелен для академической статьи и излагает базовую концепцию диаграмм состояний, которую большинство из мира SproutCore/Ember использует с конца 2010 года (то есть именно это имел в виду Michael Cohen, когда писал Ки).

Что касается вашей точки 2:

Я иногда обнаруживаю методы зеркалирования в менеджере состояний, например save: -> StateManager.send("save"), Это имеет смысл или я что-то упустил?

Вы могли бы использовать action помощник в вашем шаблоне Handlebars и установите StateManager как target

{{action "send" target="App.stateManager"}}

И send событие отправлено на ваш App.stateManager,

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