如何在gwt-platform中使用GWT的编辑框架?

Ben*_*n M 8 gwt gwt-platform gwt-editors

我正在使用gwt-platform并尝试实现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);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我明确指定ViewImplementation,它可以工作,但这不是MVP应该工作的方式:

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {}

...

editorDriver.initialize((MyViewImpl) this.getView());
Run Code Online (Sandbox Code Playgroud)

如果有人能给我一个如何正确行事的例子我会很高兴.

谢谢

Mar*_*kob 7

类似于早期版本的Expenses示例中使用的方法为我工作:

视图应实现的接口.使用通配符,以便演示者不需要知道具体的视图实现:

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();
}
Run Code Online (Sandbox Code Playgroud)

您的演示者现在应该看起来像这样:

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();
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

并且观点实施:

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;
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

这与我使用GWT的编辑框架获得MVP一样接近.我找不到视图实现的方法,不知道模型,但我认为这不是必要的.

如果有人对此有任何改进,我很高兴听到.


在GWT编辑器上找到了一些额外的评论.似乎可能无法完全分离模型.正如Thomas Broyer在回答另一个编辑问题时所说:

"MVP并非一成不变(它甚至没有定义;它是由Martin Fowler创造的,但是他退出了这个术语,转而使用了两种更具体的模式),所以你只是违反了你给自己的规则.换句话说,编辑器框架作为一个整体可以被视为违反MVP:每个编辑器都知道模型,不一定是它正在编辑的确切实例(与ValueAwareEditor或LeafValue一样),但至少它是编辑器的那种对象.