Куда поместить состояние, необходимое для различных действий GWT?

В настоящее время я работаю над приложением GWT, и я все еще немного не понимаю, как все это сочетается друг с другом (радость от необходимости вносить изменения без предварительного понимания всей структуры, хотя это все равно может быть сложно).

У нас есть несколько действий, которые соответствуют частям пользовательского интерфейса (например, основной контент, панель инструментов и список вещей). Я не совсем уверен, что именно так и задуманы действия, но я думаю, что сейчас я не могу так легко измениться. Теперь моя проблема заключается в том, что список вещей содержит состояние (текущее выделение), которое также необходимо для основного содержимого и, в некотором роде, для панели инструментов (по крайней мере, панель инструментов в настоящее время имеет это — я не спрашиваю ).

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


person Joey    schedule 19.07.2012    source источник


Ответы (1)


Я вижу здесь два основных решения:

  • сохраняйте состояние в каждом действии и синхронизируйте их с помощью событий (на EventBus). То есть: в «списке вещей» есть текущий выбор, в главном представлении тоже есть, так же как и на панели инструментов; и каждый раз, когда это значение изменяется, действие, которое вносит изменение, запускает событие на шине событий, чтобы другие действия могли обновлять свое состояние, чтобы все действия имели одно и то же значение в своем собственном состоянии.

  • используйте одноэлементный объект (если вы используете GIN и внедрение зависимостей, просто аннотируйте объект с помощью @Singleton и вставьте его во все действия), чтобы сохранить состояние в центральном месте. Действия регистрируют обработчики событий в объекте держатель состояния, чтобы получать уведомления при его изменении. То есть каждый раз, когда действие вызывает setCurrentSelection (например), запускается событие (например, ValueChangeEvent), и поскольку все действия прослушивают его, они могут обновить свое представление или что-то еще в зависимости от нового значения. Вы можете либо отправить событие на шину событий (аналогично PlaceController), либо использовать держатель состояния для реализации HasValueChangeHandlers. Просто не забудьте отменить регистрацию обработчиков при выполнении действий stop, чтобы избежать утечек памяти (диспетчеризация на шине событий упрощает задачу: просто зарегистрируйте обработчики на шине, переданные в качестве аргумента методу start, и они будут автоматически отменены после остановки действия , и вам даже не нужно об этом думать).

Собственно, PlaceController — хороший пример такого общего состояния (текущее место).

person Thomas Broyer    schedule 19.07.2012
comment
Хорошо, я воспроизвел состояние в действиях на данный момент, и когда я узнаю больше о том, как следует использовать GWT, я могу снова все это выбросить и сделать по-другому. Однако на данный момент он работает достаточно хорошо. - person Joey; 20.07.2012