Как использовать GWT Editor Framework с gwt-платформой?

Я использую gwt-платформу и пытался реализовать структуру редактора GWT. Но у меня не получается работать из ведущего. В Интернете есть несколько ответов, в которых говорится, что мне нужно каким-то образом внедрить EditorDriver в Presenter, но я не знаю, как это сделать...

На данный момент я безуспешно пробовал это:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends View, HasUiHandlers<MyUiHandlers>, Editor<MyModel> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    interface Driver extends SimpleBeanEditorDriver<MyModel, MyView> {}
    private Driver editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = GWT.create(Driver.class);
        editorDriver.initialize(this.getView());
        editorDriver.edit(m);
    }

    ...
}

Это работает, если я явно указываю ViewImplementation, но это не так, как должен работать MVP:

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {}

...

editorDriver.initialize((MyViewImpl) this.getView());

Было бы неплохо, если бы кто-нибудь мог привести мне пример, как это сделать правильно.

Спасибо


person Benjamin M    schedule 22.05.2012    source источник


Ответы (3)


Подход, аналогичный тому, что использовался в более ранней версии Пример расходов работал у меня:

Интерфейс, который должно реализовать представление. Подстановочный знак используется, чтобы докладчику не нужно было знать конкретную реализацию представления:

import com.google.gwt.editor.client.Editor;
import com.gwtplatform.mvp.client.View;

/**
 * Implemented by views that edit beans.
 *
 * @param <B> the type of the bean
 */
public interface BeanEditView<B> extends View, Editor<B> {

  /**
   * @return a new {@link SimpleBeanEditorDriver} initialized to run
   *         this editor
   */
  SimpleBeanEditorDriver<B, ?> createEditorDriver();
}

Теперь ваш докладчик должен выглядеть примерно так:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends BeanEditView<MyModel>, HasUiHandlers<MyUiHandlers> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    private SimpleBeanEditorDriver<MyModel, ?> editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = getView().createEditorDriver();
    }

    ...
}

И реализация представления:

public class MyViewImpl extends ViewWithUiHandlers<MyUiHandlers> implements
    MyPresenter.MyView {

  public interface Binder extends UiBinder<Widget, MyViewImpl> { }
  private static Binder uiBinder = GWT.create(Binder.class);

  /**
   * The driver to link the proxy bean with the view.
   */
  public interface EditorDriver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> { }

  private final Widget widget;

  public MyViewImpl() {
    widget = uiBinder.createAndBindUi(this);
  }

  @Override
  public SimpleBeanEditorDriver<MyModel, ?> createEditorDriver() {
    EditorDriver driver = GWT.create(EditorDriver.class);
    driver.initialize(this);
    return driver;
  }

  @Override
  public Widget asWidget() {
    return widget;
  }

  ...
}

Это максимальное приближение к MVP с помощью GWT Editor Framework. Я не мог найти способ, чтобы реализация представления НЕ знала модель, но я не думаю, что это действительно необходимо.

Если у кого-то есть какие-либо улучшения по этому поводу, я рад слышать.


Найдены дополнительные комментарии к редакторам GWT. Кажется, что полностью разделить модель просто невозможно. Как Томас Бройер выразился в своем ответе на другой вопрос редактора:

«MVP не высечен на камне (он даже не определен; он был придуман Мартином Фаулером, но он отказался от этого термина в пользу двух более конкретных паттернов), поэтому вы только нарушаете правила, которые сами себе дали. Иными словами, Фреймворк редактора в целом можно рассматривать как нарушение MVP: каждый редактор знает модель, не обязательно точный экземпляр, который он редактирует (как в случае с ValueAwareEditor или LeafValue), но, по крайней мере, тип объектов, редактором которых он является».

person Marco Jakob    schedule 22.05.2012
comment
Спасибо :) Возможно, вы правы, и это неплохо, если представление знает модель, потому что иначе мне пришлось бы устанавливать множество сеттеров и геттеров в ViewInterface. Это будет означать, что View тоже знает свою модель (вроде)... - person Benjamin M; 22.05.2012
comment
Это отличное решение. Спасибо! - person confile; 21.01.2014
comment
Спасибо. После 2 дней борьбы с Editors и GWTP наконец-то у меня все заработало. Если вы сделали некоторые улучшения в этом, пожалуйста, дайте мне знать. - person masterdany88; 27.01.2016

Проблема в том, что Driver.class перешел в GWT.create

editorDriver = GWT.create(Driver.class);

должен быть конкретный класс, который содержит все подредакторы, то есть все uibinded виджеты.

Одно из решений заключается в следующем:

Интерфейс просмотра расширяет интерфейс редактора для объекта «Модель».

public interface MyView extends View, ..., Editor<MyModel>

Реализация представления MyViewImpl определяет тип драйвера

interface MyDriverImpl extends SimpleBeanEditorDriver<MyModel,MyViewImpl>

Драйвер создается в MyViewImpl с помощью

SimpleBeanEditorDriver<MyModel,MyView> driver = GWT.create(MyDriverImpl.class);

Родительский тип

SimpleBeanEditorDriver<MyModel,MyView>

может использоваться для передачи ссылок драйвера ведущему

person rcomblen    schedule 18.06.2012

MVP говорит, что вы используете презентатор, чтобы полностью отделить модель от представления. Кроме того, я бы сказал, что ваш подход помещает логику в представление... Я надеюсь, что есть другое решение;)

person Benjamin M    schedule 22.05.2012