2012-05-22 6 views
8

Ich benutze gwt-Plattform und versuchte, GWT-Editor-Framework zu implementieren. Aber ich kann es nicht aus dem Moderator heraus arbeiten. Es gibt einige Antworten rund um das Web, die sagen, dass ich die EditorDriver injizieren müssen irgendwie in den Moderator, aber ich weiß nicht, wie dies zu tun ...Wie benutzt man das GWT Editor Framework mit der gwt-Plattform?

Im Moment habe ich schon versucht, diese ohne Erfolg:

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

    ... 
} 

es funktioniert, wenn ich explizit die ViewImplementation angeben, aber das ist nicht die Art und Weise MVP funktionieren soll:

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {} 

... 

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

ich wäre schön, wenn mir jemand ein Beispiel geben könnte, wie es richtig zu machen.

Dank

Antwort

7

Ein Ansatz ähnlich dem, was in einer früheren Version des Expenses sample für mich gearbeitet wurde verwendet:

sollte

Eine Schnittstelle, die die Ansicht implementieren. Der Platzhalter wird verwendet, so dass der Moderator nicht die konkrete Ansicht Umsetzung kennen muss:

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

Ihr Moderator sollte nun wie folgt aussehen:

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

    ... 
} 

und die Aussicht 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; 
    } 

    ... 
} 

Das ist so nah wie ich MVP mit GWT Editor Framework bekommen konnte. Ich konnte keinen Weg finden, die Ansicht zu implementieren, um das Modell NICHT zu kennen, aber ich denke nicht, dass es wirklich notwendig ist.

Wenn jemand Verbesserungen daran hat, bin ich froh zu hören.


Einige zusätzliche Kommentare zu GWT Editors gefunden. Es scheint, dass es nicht möglich ist, das Modell vollständig zu trennen. Wie Thomas Broyer setzt es in his answer auf einen anderen Editor Frage:

„MVP ist nicht in Stein gemeißelt (es ist nicht einmal definiert, sondern von Martin Fowler geprägt wurde, aber er zog sich den Begriff für zwei weitere spezifische Muster) Sie verletzen also nur die Regeln, die Sie sich selbst gegeben haben Anders ausgedrückt, das Editor-Framework als Ganzes kann als Verstoß gegen MVP angesehen werden: Jeder Editor kennt das Modell, nicht unbedingt die genaue Instanz, die es bearbeitet (wie bei ValueAwareEditor oder LeafValue) , aber zumindest die Art von Objekten, für die es ein Editor ist. "

+0

Danke :) Vielleicht hast du recht und es ist nicht schlecht, wenn die Ansicht das Modell kennt, ' sonst müsste ich viele Setter und Getter im ViewInterface einstellen. Dies würde bedeuten, dass die Ansicht auch ihr Modell kennt (Art von) ... –

+0

Dies ist eine großartige Lösung. Vielen Dank! – confile

+0

Danke. Nach zwei Tagen des Kampfes mit Redakteuren und GWTP mache ich es endlich möglich. Wenn Sie diesbezüglich einige Verbesserungen vorgenommen haben, lassen Sie es mich wissen. – masterdany88

0

MVP besagt, dass Sie den Präsentator verwenden, um das Modell vollständig von der Ansicht zu trennen. Ich würde dazu sagen, dass Ihr Ansatz Logik innerhalb der Ansicht bringt ... Ich hoffe, dass es eine andere Lösung ist;)

2

Das Problem ist, dass die Driver.class zu GWT.create geben

editorDriver = GWT.create(Driver.class); 

muss die konkrete Klasse, die alle Unter-Editoren enthält, dh alle uibinded-Widgets.

Eine Lösung ist die folgende:

Die Ansicht Schnittstelle erweitert den Editor-Schnittstelle für das Modellobjekt

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

Die Ansicht Umsetzung MyViewImpl eine Fahrertyp

interface MyDriverImpl extends SimpleBeanEditorDriver<MyModel,MyViewImpl> 

Der Fahrer definiert ist, installed in MyViewImpl durch

Der Muttertyp

SimpleBeanEditorDriver<MyModel,MyView> 

kann verwendet werden, Referenzen des Fahrers auf die Vortragende passieren

Verwandte Themen