Как установить Presenter в составном виджете в GWT
У меня есть приложение GWT 2.4 с использованием MVP, clientFactory, действий, мест и uiBinder. У меня есть составной виджет, который я создал как отдельный объект с собственным файлом ui.xml. Я ссылаюсь на этот класс и вставляю его в основной файл viewImpl.ui.xml.
Составной виджет получает некоторые данные из бэкэнда, и мне нужно вернуть их в действие, чтобы они могли отображаться в таблице. Я использую докладчик, связанный с представлением, чтобы перейти к действию. Вот код: В интерфейсе просмотра:
public interface NameView extends IsWidget
{
void setPresenter(Presenter presenter);
...
public interface Presenter{
void goTo(Place place);
void setRowDataList(List<Data> rowData);
}
В моей деятельности я реализую View.Presenter как в:
Activity extends AbstractActivity implements NameView.Presenter
таким образом, задание - это нужный мне докладчик из моего автономного виджета и в методе запуска для действия, которое я использую:
NameView nameView = clientFactory.getNameView();//NameView is just an example.
nameView.setPresenter(this); ...
настроить докладчика и создать его экземпляр. Моя проблема в виджете, мне нужно это:
presenter.setRowDataList(rowData);
но я не уверен, как ссылаться на созданный экземпляр Presenter из виджета?
Этот отдельный виджет, фактически виджет gwtUpload, является автономным. Я делаю вычисления на стороне сервера для некоторых данных, которые загружаются, и это то, что возвращается обратно в этот виджет.
Данные виджета должны возвращаться в Activity для передачи этих данных обратно в класс NameViewImpl.
Я думал, что презентатор был правильным способом сделать это, но, поскольку виджет не связан с view или viewImpl, мне нужен способ получить этого презентатора для виджета.
Я знаю, что GIN сделает это с DI или, может быть, я создам другого докладчика. Я никогда не настраивал GIN с GWT. Есть идеи, как правильно это сделать?
Рабочая реализация:
Я не знаю, является ли это лучшей реализацией или нет, но основываясь на ответе Томаса, я установил свой виджет на экземпляр Presenter(активность) в методе setPresenter() в классе ViewImpl. Это работает как проход для виджета, чтобы возвратиться к действию. Я предполагаю, что Томас имел в виду интерфейс обратного вызова.
2 ответа
Что мы делали в подобных ситуациях, так это определяли интерфейс обратного вызова для виджета (аналогично интерфейсу презентатора в вашей паре презент-представление), а затем мы обычно заставляли интерфейс презентатора расширять этот специфичный для виджета интерфейс.
Потом, когда мы позвоним setPresenter
(или как там это называется) в представлении, чтобы связать докладчика, представление немедленно вызывает setCallback
на виджете с тем же значением (презентатор реализует интерфейс обратного вызова).
Альтернативный дизайн - скрыть обратный вызов, специфичный для виджета, за методом интерфейса вашего докладчика. Пусть представление реализует обратный вызов, реализуя метод таким образом, что он направляется к эквивалентному методу презентатора.
Кстати, Джин не поможет здесь.
Если я вас правильно понимаю, у вас есть один набор объектов деятельности, докладчик и пользовательский интерфейс (NameView
) и еще один объект, отделенный от этих трех. Разделенный объект - это виджет gwtUpload.
Один из способов уведомить докладчика - использовать eventBus
, Я уверен, что у вас есть ссылка в деятельности. Для gwtUpload
Я не знаю, что именно вы подразумеваете под "автономным" объектом, у вас должна быть какая-то связь с другим докладчиком, чтобы достичь eventBus
,
Виджет gwtUpload будет запускать событие (через своего собственного докладчика) в eventBus
с результатом расчетов на стороне сервера. Помните, что в качестве результата рекомендуется отправлять только объекты модели. Деятельность "зарегистрирует" обработчик на eventBus
для мероприятия. В обработчике вы можете отправить данные в представление для обновления отображения таблицы.
Я не думаю, что вам нужно GIN
Чтобы решить эту проблему, для любого случая здесь есть хорошее руководство для начала: http://code.google.com/p/google-gin/wiki/GinTutorial