Frage

Ich versuche, einige Objekte in einer ui zuzugreifen: Bindemittelkomponente, aber nicht sicher, wie die EventBus zuzugreifen, requestFactory, etc ohne bösen Code zu schreiben, die mich nachts wach halten (auch zur Kenntnis nehmen, dass ich komplett neu zu JAVA, Hintergrund ist in Perl / Python / PHP).

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>

Das Injizieren des EventBus auf diese Weise nicht mit com.ig.client.scaffold.ui.widget.R 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 erforderliches Attribut (e): EventBus Element ... (scheint, wie es versucht, den EventBus im ui zu finden. 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);
    }
}

Beim Lesen und Lesen und Lesen für die letzten paar Tage, ich habe die EventBus, requestFactory und historyController direkt in der Ansicht Bindung an den ui nicht gesehen jemand Zugriff auf: Bindemittel-Widget, die zu dem Ergebnis geführt, dass es wahrscheinlich nicht ist best Practice trotzdem.

Lassen Sie uns sagen, dass ich ein oject haben, nennen wir es Proxy, Proxy enthält Handle die dann ruft eventBus.doSomething (). Wie verknüpfe ich dieses Proxy-Objekt zu dem ui: Bindemittel-Widget ohne es zu instanziieren mit oder ohne es zu jedem Widget um passieren zu müssen

?

Ist es möglich, GIN Injektion an einer Schnittstelle und dann implementieren diese Schnittstelle über Klasse R zu tun, die dann irgendwie die Objekte enthalten ich suche?

Jede Lösung, die Arbeit ist willkommen, nur für eine Probe suchen (das ein Java n00b verstehen kann), die mich im Grunde erlaubt mein Front-End mit dem Rest der Dienstleistungen, die von ROO erstellt zu verbinden.

Danke J

War es hilfreich?

Lösung

Schauen Sie sich die Model, View, Moderator Muster - es löst dieses Problem. Generell sind alle Nicht-Anzeigelogik gehalten werden soll Ihre Ansichten so, dass 1) die Nicht-Anzeige-Logik-Einheit getestet werden kann, ohne läuft in einem (langsamen instanziieren) Browser und 2) unterschiedliche Displays können in derselben Anwendung eingesteckt werden, ohne dass das Duplizieren die Nicht-Anzeigelogik.

Hier ist ein MVP Beispiel der ausstellenden Verhalten Sie suchen (beachten Sie, dass der Stil etwas ist anders als die Aktivitäten und 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 der GIN-Modul: bind(MyPresenter.Display.class).to(MyView.class);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top