Как установить 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

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