В документации GWT есть руководство по использованию шаблона MVP здесь. В этом примере есть два представления, и каждое заменяет другое в соответствии с действием пользователя.

В этих довольно простых представлениях было не очень больно втиснуть все виджеты, которые есть в view, только в один единственный класс (view). Но для сложного view нужно создать отдельные view для компонентов (с соответствующим presenter для каждого такого компонента view), а затем объединить эти view в общие view (это объединенное view может иметь или не иметь отдельного объединенного presenter, поскольку все под-представления уже имеют соответствующие presenters). В чем-то похоже на создание отдельных виджетов в отдельных классах, которые расширяют Composite, вызывают для них initWidget и используют их как mainPanel.add(new subPanel()) на главной панели.

Так возможно ли это сделать в шаблоне MVP в GWT?

0
SexyBeast 11 Фев 2013 в 20:51
Не могли бы вы уточнить?
 – 
SexyBeast
11 Фев 2013 в 20:59
Я имею в виду, что документация довольно скудная, поэтому рабочий пример был бы отличным ...
 – 
SexyBeast
11 Фев 2013 в 20:59
Извините, что дал вам надежду и избавился от нее. Я знаю, что это можно сделать. Я сделал это пару лет назад у другого работодателя. У меня нет доступа к коду, чтобы посмотреть, как я это сделал, и я не помню деталей. Вот еще немного. Команда init на всем экране вызывает init на каждом из подэкранов. Думаю, у меня был главный ведущий, который собирал детали и давал единый доступ к битам.
 – 
Lee Meador
11 Фев 2013 в 21:17

1 ответ

Лучший ответ

Нет, если вы сделаете это весь груз DOM за один выстрел, даже если вы поместите внутри условия if else.

При создании больших приложений с GWT использование MVP и разделения кода является обязательным - в противном случае все приложение (т. е. пакет JavaScript) загружается одним фрагментом на начальном загрузка приложения, что является хорошим рецептом для разочарованных пользователей!

Используя стандартный MVP, вы можете

Isolate of User Interface from Business tier

Easily interchangeable Views (user interfaces)

Ability to test all code more effectively 

Я полагаю, вы ожидаете, как показано ниже

public class MainPageView extends ViewImpl implements MainPagePresenter.MyView {


    @UiField
    public HTMLPanel mainMenuPanel;

    @UiField
    public HTMLPanel mainContentPanel;

    @UiField
    public HTMLPanel mainFooterPanel;

.
.
.
.
.etc

Да, вместо панелей, как показано выше, вы также можете использовать классы, внутри которых есть элементы.

Обновить:

В mainMenuPanel вы можете добавить свой класс, например mainMenuPanel.add (new MyheaderClass ()). Где MyheaderClass расширяет Panel или Widget. Таким образом, все элементы в классе добавляют к mainMenuPanel

Внутри вашего класса MyheaderClass вы можете добавить labels, buttons ... и т. Д., Используя this.add(mybutton) .. и т. Д.

1
Suresh Atta 12 Фев 2013 в 11:25
Я не совсем тебя понял. Представьте, что мой проект в настоящее время не является MVP-совместимым, но я хочу это сделать. Он состоит из трех панелей, верхней, центральной и нижней, которые вызываются в основном модуле. Эти три панели определены в отдельных классах (я вызываю его, вызывая initWidget). Сами эти классы содержат несколько других виджетов, которые также определены в отдельных классах, и это каскадирование продолжается на нескольких уровнях. Итак, вместо панелей или виджетов, определенных в отдельных классах, могу ли я заменить их представлениями и другим соответствующим классом презентатора?
 – 
SexyBeast
12 Фев 2013 в 09:43
Да, вы можете использовать без каких-либо колебаний.
 – 
Suresh Atta
12 Фев 2013 в 10:06
Можете ли вы дать мне представление, как это сделать?
 – 
SexyBeast
12 Фев 2013 в 10:25
Я понимаю, что вы пытаетесь сказать. Я проделал то же самое с виджетами. Объявите виджеты в отдельных классах, вызовите для них initWidget и добавьте их в родительскую панель, например parentPanel.add(new subPanel()). Сама эта parentpanel может быть субпанелью, поэтому после вызова initWidget ее тоже можно добавить к своей родительской панели, например headPanel.add(new parentPanel()). Но теперь у нас есть представления вместо панелей. Эти панели содержали события в одном классе, здесь представления содержат только виджеты, а события передаются их ведущему. Как добавить сейчас?
 – 
SexyBeast
12 Фев 2013 в 15:00
Я имею в виду, что-то вроде этого. Существует представление с именем subView1' which is tied to presenter subViewPresenter1 . Similarly for subView2` и subView3. Теперь я хочу добавить эти три, чтобы сказать родительский вид nestedViews. Это представление является просто контейнером, у него не обязательно должен быть ведущий, так как все подпредставления имеют докладчиков, которые заботятся о своих событиях. Как мне теперь добавить эти три дополнительных представления к этому родительскому представлению?
 – 
SexyBeast
12 Фев 2013 в 15:02