2012-05-22 88 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> 

可用於駕駛員的引用傳遞給主持人