Как установить Presenter в составном виджете в GWT - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть приложение GWT 2.4, использующее MVP, clientFactory, действия, места и uiBinder.У меня есть составной виджет, который я создал как отдельный объект с собственным файлом ui.xml.Я ссылаюсь на этот класс и вставляю его в основной файл viewImpl.ui.xml.

Составной виджет получает некоторые данные из бэкэнда, и мне нужно вернуть их в действие, чтобы они могли отображаться в таблице.Я использую докладчик, связанный с представлением, чтобы перейти к действию.Вот код: В интерфейсе View:

public interface NameView extends IsWidget
{
    void setPresenter(Presenter presenter);
...    

public interface Presenter{
            void goTo(Place place);
            void setRowDataList(List<Data> rowData);
        }

В своем Activity я реализую 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.

Я думал, что презентатор был правильным способом сделать это, но, поскольку виджет не подключен к представлению или представлению. Мне нужен способ получить этого презентатора для виджета.

IЯ знаю, что GIN сделает это с DI или, может быть, я создам другого докладчика.Я никогда не настраивал GIN с GWT.Любые идеи относительно правильного способа сделать это?

Рабочая реализация:

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

То, что мы сделали в аналогичных ситуациях, - это определение интерфейса обратного вызова для виджета (аналогично интерфейсу презентатора в вашей паре презент-представление), а затем мы обычно заставляем интерфейс презентатора расширять этот специфичный для виджета интерфейс.
Затем, когда мы вызываем setPresenter (или как его там) в представлении, чтобы связать докладчика, представление немедленно вызывает setCallback для виджета с тем же значением (презентатор реализует интерфейс обратного вызова).

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

Кстати, GIN здесь не поможет.

1 голос
/ 22 декабря 2011

Если я вас правильно понимаю, у вас есть один набор объектов деятельности, презентатор и пользовательский интерфейс (NameView) и другой объект, отделенный от этих трех.Разделенный объект - это виджет gwtUpload.

Одним из способов уведомления докладчика является использование eventBus.Я уверен, что у вас есть ссылка в деятельности.Для gwtUpload Я не знаю, что именно вы подразумеваете под «автономным» объектом, у вас должна быть какая-то связь с другим докладчиком, чтобы достичь eventBus.

Виджет gwtUpload будет запускать событие (через собственного презентатора) в eventBus с результатом вычислений на стороне сервера.Помните, что в качестве результата рекомендуется отправлять только объекты модели.Действие "зарегистрирует" обработчик на eventBus для события.В обработчике вы можете отправить данные в представление для обновления отображения таблицы.

Я не думаю, что вам нужно GIN, чтобы решить эту проблему, для любого случая здесь хороший урок для запуска: http://code.google.com/p/google-gin/wiki/GinTutorial

...