MVP и связь между виджетами GWT - PullRequest
5 голосов
/ 29 января 2010

Если я использую шаблон MVP с GWT, как в архитектуре GWT, рассказывается о лучших методах ввода-вывода Google от 2009 года, но информация распределена по нескольким виджетам, как должен заполняться объект значения?

Допустим, у меня есть EditPersonView / Presenter, EditPetView / Presenter и EditAddressView / Presenter, а последние два являются виджетами как часть панели в EditPersonView. С этим у меня есть следующий класс:

class PersonDetails {
    private PetDetails pet;
    private AddressDetails addressDetails;

    // ...
}

Переменные экземпляра PetDetails и AddressDetails управляются с помощью их презентаторов. Когда пользователь нажимает кнопку «Сохранить» в EditPersonView, как должен осуществляться обмен данными между виджетами, чтобы PersonDetails заполнялся информацией из его дочерних виджетов?

Ответы [ 3 ]

3 голосов
/ 29 января 2010

Если вы посмотрите на страницу 42 презентации Рэя Райана из Google IO 2009, вы должны найти решение своего вопроса. Вы используете «шину событий» (общий экземпляр HandlerManager) и запускаете свое пользовательское событие PetDetailsChangedEvent и прослушиваете это событие из своих дочерних виджетов (стр. 45). Кроме того, помните, что, хотя разъединение и т. Д. Прекрасно, и все, некоторая связь не является плохой вещью и может фактически быть лучшим решением, чем попытка принудительно связать все, - так говорит Р.Р. :)

1 голос
/ 14 февраля 2010

Я сталкивался с той же проблемой в нескольких различных приложениях GWT, которые я разработал с использованием подхода Рэя Райана. Мое предпочтительное решение состоит в том, чтобы создать синглтонский «объект сеанса», который хранит состояние этой части приложения. В вашем примере это может выглядеть так:

interface EditPersonSession {

    void fetchPerson(PersonId id);
    PersonDetails getCurrentPersonDetails();
    void updatePersonDetail(PersonDetail<?> detail);
    void updatePetDetail(PetDetail<?> detail);
    void updateAddressDetail(AddressDetail<?> detail);
    void save();

}

Все три докладчика содержат ссылку на объект сеанса (возможно, введенный Джином). Всякий раз, когда пользователь манипулирует пользовательским интерфейсом (представлением), презентатор, связанный с этим представлением, немедленно передает состояние общему объекту сеанса. Например, внутри EditAddressPresenter:

view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() {

    void onValueChange(ValueChangeEvent<String> event) {
        editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue()));
    }

}

Когда приходит время сохранения, объекту состояния предписывается сохранить состояние на сервере. На этом этапе объект сеанса имеет новейшие представления данных и может сохранить их все сразу. Итак, в EditPersonPresenter:

view.getSaveButton().addClickHandler(new ClickHandler() {

    void onClick(ClickEvent event) {
        editPersonSession.save();
    }

}

Таким образом, докладчики не должны содержать никаких ссылок друг на друга, но могут отправлять согласованную информацию на сервер. Если докладчикам необходимо знать, когда информация, которую они отображают, была обновлена ​​(либо другими докладчиками, либо сервером), объект сеанса может уведомить их, запустив события на шине событий (совместно используемый Singleton HandlerManager). Затем докладчики могут извлечь самые последние данные PersonDetails из объекта сеанса.

0 голосов
/ 18 февраля 2010

Я также пришел к выводу, что у меня может быть одна модель, которая соответствует каждому докладчику. Таким образом, PetWidget может создавать экземпляр Pet, а PersonWidget может создавать экземпляр Person. Затем PersonWidget может содержать один или несколько PetWidget, что, в свою очередь, означает, что класс Person может иметь список экземпляров Pet.

...