2011-01-09 11 views
1

Ich versuche, auf einige Objekte innerhalb einer UI: Binder-Komponente zugreifen, aber nicht sicher, wie auf den EventBus, requestFactory usw. zugreifen, ohne lästigen Code zu schreiben halte mich nachts wach (achte auch darauf, dass ich komplett neu bei JAVA bin, der Hintergrund ist in Perl/Python/PHP).Spring ROO GWT mit GIN-Injektion auf Widgets erstellt von UI: Binder

Meine ui.xml Datei:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui' 
    xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'> 
    <ui:style> 
     ... 
    </ui:style> 
    <g:HorizontalPanel> 
     ... 
    </g:HorizontalPanel> 
</ui:UiBinder> 

die EventBus Spritzen auf diese Weise mit com.ig.client.scaffold.ui.widget.R versagt hat keinen Standard (Null args) Konstruktor.

public class R extends Composite { 

    interface MyUiBinder extends UiBinder<Widget, R> {} 
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); 

    private final EventBus eventBus; 

    @UiField SimplePanel fieldA, ...; 

    @Inject 
    public R(EventBus eventBus){ 
     this.eventBus = eventBus; 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

So, wie pro die Fehlermeldung, erstelle ich eine UIFactory und dann bekomme ich einen Fehler ... '{style.entityComponent}'> fehlende erforderliche Attribut (e): EventBus Element ... (scheint, wie es die EventBus im ui zu finden versucht. Bindemittel Sheet

public class R extends Composite { 

    interface MyUiBinder extends UiBinder<Widget, R> {} 
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); 

    private final EventBus eventBus; 

    @UiField SimplePanel fieldA, ...; 

    public @UiConstructor R(EventBus eventBus){ 
     this.eventBus = eventBus; 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 

    @Inject 
    @UiFactory R makeR(){ 
     return new R(eventBus); 
    } 
} 

Vom Lesen und Lesen und Lesen für die letzten paar Tage, ich habe die EventBus, requestFactory und historyController nicht gesehen jemand Zugriff auf direkt in der Ansicht Bindung an die Ui: Binder-Widget, die zu der Schlussfolgerung führte, dass es wahrscheinlich keine Best Practice ist a Nyway.

Sagen wir, ich habe ein Ojekt, nennen wir es Proxy, Proxy enthält handleButtonClick, das dann eventBus.doSomething() aufruft. Wie verknüpfe ich dieses Proxy-Objekt mit dem Widget ui: binder, ohne es instanziieren zu müssen oder ohne es an jedes Widget weitergeben zu müssen?

Ist es möglich, eine GIN-Injektion an einer Schnittstelle durchzuführen und diese Schnittstelle dann über die Klasse R zu implementieren, die dann irgendwie die Objekte enthält, nach denen ich suche?

Jede Lösung, die funktioniert, ist willkommen, nur auf der Suche nach einem Beispiel (das ein Java n00b verstehen kann), das mir im Grunde erlauben wird, mein Front-End mit den anderen von ROO erstellten Diensten zu verbinden.

Dank J

Antwort

2

Schauen Sie sich die Model, View, Presenter pattern - es löst dieses Problem. Im Allgemeinen sollte alle Nicht-Display-Logik Ihrer Ansichten herausgehalten werden, so dass 1) die Non-Display-Logik Einheit getestet werden kann, ohne innerhalb eines Browsers (langsam zu instanziieren) und 2) verschiedene Displays können in dasselbe eingesteckt werden Anwendung ohne Duplizieren die Nicht-Display-Logik.

Hier ist ein MVP Beispiel ausstellenden das Verhalten Sie suchen (beachten Sie, dass der Stil etwas anders ist als die Aktivitäten & Orte Implementierung).

MyPresenter.java:

public class MyPresenter { 
    public interface Display extends IsWidget { 
    void setButtonClickHandler(ClickHandler buttonClickHandler); 
    } 

    private final Display display; 
    private final EventBus eventBus; 

    @Inject 
    public MyPresenter(EventBus eventBus, 
        Display display) 
    { 
    this.display = display; 
    this.eventBus = eventBus; 

    bind(); 
    } 

    private void bind() { 
    display.setButtonClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
     eventBus.fireEvent(new MyButtonClickedEvent()); 
     } 
    }); 
    } 

    public void go(HasWidgets container) { 
    container.add(display.asWidget()); 
    } 
} 

MyView.ui.xml:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui' 
    xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'> 

    <g:Button ui:field="myButton"/> 
</ui:UiBinder> 

MyView.

java
public class MyView extends Composite implements MyPresenter.Display { 
    interface MyViewUiBinder extends UiBinder<Widget, MyView> {} 
    private static MyViewUiBinder uiBinder = GWT.Create(MyViewUiBinder.class); 

    private ClickHandler buttonClickHandler = null; 

    public MyView() { 
    initWidget(uiBinder.createAndBindUi(this)); 
    } 

    @UiHandler("myButton") 
    void onButtonClick(ClickEvent event) { 
    if (buttonClickHandler != null) { 
     buttonClickHandler.onClick(event); 
    } 
    } 

    @Override 
    public void setButtonClickHandler(ClickHandler buttonClickHandler) { 
    this.buttonClickHandler = buttonClickHandler; 
    } 
} 

Und in Ihrer GIN-Modul: bind(MyPresenter.Display.class).to(MyView.class);

+0

Dank Jason, ich lese über heute Morgen MVP docs Google-Code und es schien genau das zu sein, was ich gesucht habe, wird später am Abend implementieren. Danke eine Million :-) –

+0

Hallo Jason, ich bekomme nicht Ihr Beispiel funktioniert, haben Sie die Quelle für mich verfügbar oder würde es Ihnen etwas ausmachen, meinen Code zu sehen und auf das Problem hinweisen - ich bin nicht verbindlich arbeiten und seit Wochen kämpfen. –

+0

Warum stellen Sie nicht eine neue Frage speziell für das Problem, das Sie haben, und verlinken Sie hier von einem Kommentar, damit ich es sehe? –

Verwandte Themen