2012-05-22 64 views
8

我正在使用gwt平台并试图实现GWT的编辑器框架。但我从主持人那里得不到它的工作。有各地的网络一些答案,那说我必须以某种方式注入到EditorDriver演示,但我不知道如何做到这一点?如何使用GWT的编辑器框架与gwt平台?

在这个我试过没有成功的那一刻:

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

我会很高兴,如果有人可以给我一个例子,如何做是正确的。

感谢

回答

7

类似于是在Expenses sample的早期版本中使用的方法为我工作:

的接口,该视图应该实现。通配符使用,这样的主持人并不需要知道具体的视图实现:

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

    ... 
} 

和视图implmementation:

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

    ... 
} 

这与我可以通过GWT的编辑框架获得MVP的结果一样。我无法找到视图实现的方式来不知道模型,但我不认为这是真的有必要。

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


在GWT编辑器上发现了一些额外的评论。看起来可能完全分开模型是不可能的。正如托马斯Broyer把它放在his answer另一个编辑器的问题:

“MVP不是一成不变的(它甚至没有定义,它是由Martin Fowler创造的,但他退休赞成两个特定的模式术语) ,所以你只是违反了你给自己的规则,换句话说,编辑器框架作为一个整体可以被视为违反MVP:每个编辑器都知道模型,不一定是它正在编辑的确切实例(与ValueAwareEditor或LeafValue一样) ,但至少是它编辑的那种物体。“

+0

谢谢:)也许你说得对,如果视图知道模型是不坏,“因为我必须在ViewInterface中设置很多setter和getters。这意味着视图也知道它的模型(种类)... –

+0

这是一个很好的解决方案。谢谢! – confile

+0

谢谢。经过2天的编辑和GWTP的努力,终于让它成功了。如果您对此做了一些改进,请告诉我。 – masterdany88

0

MVP表示,您使用演示者将视图中的模型完全分开。另外我想说的是你的方法把视图里面的逻辑...... 我希望有另一种解决方案;)

2

的问题是,Driver.class传递给GWT.create

editorDriver = GWT.create(Driver.class); 

必须拥有所有子编辑器的具体类,即所有无关联的小部件。

的一个解决方案是:

视图接口扩展了编辑接口,用于模型对象

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> 

可用于驾驶员的引用传递给主持人