Domanda

sto cercando di accedere ad alcuni oggetti all'interno di un'interfaccia utente: componente legante, ma non è sicuro di come accedere al EventBus, requestFactory, ecc senza scrivere codice brutta che mi terrà sveglio la notte (anche prendere atto che sono completamente nuovo per JAVA, lo sfondo è in Perl / Python / PHP).

Il mio file 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'>
    <ui:style>
        ...
    </ui:style>
    <g:HorizontalPanel>
        ...
    </g:HorizontalPanel>
</ui:UiBinder>

Iniettando l'EventBus in questo modo viene a mancare con com.ig.client.scaffold.ui.widget.R non ha alcun valore predefinito (pari a zero args) costruttore.

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

Quindi, come per il messaggio di errore, ho creare un UIFactory e poi ottengo un errore  ... '{} style.entityComponent'> manca attributo obbligatorio (s): EventBus Elemento ... (sembra che sta cercando di trovare l'EventBus nell'interfaccia utente:. Stylesheet legante

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

Dalla lettura e la lettura e più leggere da un paio di giorni, non ho visto nessuno l'accesso alla EventBus, requestFactory e historyController direttamente nella vista legame alla ui: legante widget di che ha portato alla conclusione che probabilmente non è una best practice in ogni caso.

dire Let ho un ogetto, chiamiamolo Proxy, Proxy contiene HandleButtonClick che poi chiama eventBus.doSomething (). Come faccio a collegare questo oggetto proxy per l'interfaccia utente: legante widget di senza dover istanziare o senza dover passare intorno ad ogni widget di

?

E 'possibile fare l'iniezione GIN su un'interfaccia e quindi implementare l'interfaccia tramite classe R che poi in qualche modo contenere gli oggetti che sto cercando?

Qualsiasi soluzione che il lavoro è il benvenuto, solo in cerca di un campione (che un n00b Java può capire) che fondamentalmente mi permetterà di collegare il mio front-end con il resto dei servizi creati da ROO.

Grazie J

È stato utile?

Soluzione

Controlla la Model, View, Presenter modello - Risolve questo problema. Generalmente ogni logica non visualizzazione deve essere tenuto fuori le visualizzazioni di modo che 1 logico) la non visualizzazione può essere provato senza unità in esecuzione all'interno di una (lenta per istanziare) browser e 2) diverso display possono essere collegati alla stessa applicazione senza duplicare la logica senza display.

Ecco un esempio MVP esibendo il comportamento che stai cercando (nota che lo stile è un po ' diverso da quello delle Attività e luoghi di implementazione).

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

E nel modulo GIN: bind(MyPresenter.Display.class).to(MyView.class);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top