How to use GWT's Editor Framework with gwt-platform?

前端 未结 3 585
一个人的身影
一个人的身影 2020-12-30 10:54

I\'m using gwt-platform and tried to implement GWT\'s editor framework. But I don\'t get it working from within the presenter. There are some answers around the web, that sa

3条回答
  •  醉梦人生
    2020-12-30 11:56

    An approach similar to what was used in an earlier version of the Expenses sample worked for me:

    An interface that the view should implement. The wildcard is used so that the presenter does not need to know the concrete view implementation:

    import com.google.gwt.editor.client.Editor;
    import com.gwtplatform.mvp.client.View;
    
    /**
     * Implemented by views that edit beans.
     *
     * @param  the type of the bean
     */
    public interface BeanEditView extends View, Editor {
    
      /**
       * @return a new {@link SimpleBeanEditorDriver} initialized to run
       *         this editor
       */
      SimpleBeanEditorDriver createEditorDriver();
    }
    

    Your presenter should look something like this now:

    public class MyPresenter extends Presenter implements MyUiHandlers {
        public interface MyView extends BeanEditView, HasUiHandlers {}
    
        @ProxyStandard
        @NameToken(NameTokens.myPage)
        @NoGatekeeper
        public interface MyProxy extends ProxyPlace {} 
    
        private SimpleBeanEditorDriver 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();
        }
    
        ...
    }
    

    And the view implmementation:

    public class MyViewImpl extends ViewWithUiHandlers implements
        MyPresenter.MyView {
    
      public interface Binder extends UiBinder { }
      private static Binder uiBinder = GWT.create(Binder.class);
    
      /**
       * The driver to link the proxy bean with the view.
       */
      public interface EditorDriver extends SimpleBeanEditorDriver { }
    
      private final Widget widget;
    
      public MyViewImpl() {
        widget = uiBinder.createAndBindUi(this);
      }
    
      @Override
      public SimpleBeanEditorDriver createEditorDriver() {
        EditorDriver driver = GWT.create(EditorDriver.class);
        driver.initialize(this);
        return driver;
      }
    
      @Override
      public Widget asWidget() {
        return widget;
      }
    
      ...
    }
    

    That's as close as I could get to MVP with GWT's Editor Framework. I couldn't find a way for the view implementation to NOT know the model but I don't think it's really necessary.

    If anyone has any improvements on this, I'm glad to hear.


    Found some additional comments on GWT Editors. It seems that it might just not be possible to completely separate the model. As Thomas Broyer puts it in his answer to another Editor question:

    "MVP is not set in stone (it's not even defined; it was coined by Martin Fowler but he retired the term in favor of two more specific patterns), so you're only violating the rules you gave to yourself. Put differently, the Editor framework as a whole can be seen as violating MVP: each editor know the model, not necessarily the exact instance it's editing (as with ValueAwareEditor or LeafValue), but at least the kind of objects it's an editor of."

提交回复
热议问题