Pregunta

Estoy intentando acceder a algunos objetos dentro de una interfaz de usuario: componente aglutinante, pero no está seguro de cómo acceder a la EventBus, RequestFactory, etc, sin necesidad de escribir código desagradable que me mantendrá despierto en la noche (también tomar nota de que soy completamente nuevo en JAVA, el fondo es en Perl Python / / PHP).

Mi archivo 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>

La inyección del EventBus esta manera falla con com.ig.client.scaffold.ui.widget.R tiene ningún valor predeterminado (cero args) constructor.

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

Por lo tanto, de acuerdo con el mensaje de error, creo una UIFactory y luego me sale un error ... '{style.entityComponent}'> le falta el atributo requerido (s): EventBus Elemento ... (parece que está tratando de encontrar la EventBus en la interfaz de usuario:. Aglomerante de estilo

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

A partir de la lectura y de lectura y más lectura durante el último par de días, no he visto a nadie el acceso a la EventBus, RequestFactory y historyController directamente en la vista de la unión a la interfaz de usuario: ligante widget de lo que llevó a la conclusión de que no es probable una buena práctica de todos modos.

Vamos a decir que tengo una oject, llamémoslo Proxy, Proxy contiene HandleButtonClick que a su vez llama a eventBus.doSomething (). ¿Cómo se vincula este objeto proxy de la interfaz de usuario: ligante Reproductor sin tener que crear una instancia o sin tener que pasar alrededor de cada widget de

?

¿Es posible hacer la inyección GIN en una interfaz y luego implementar la interfaz a través de la clase R, que contendrá entonces de alguna manera los objetos que estoy buscando?

Cualquier solución que el trabajo es bienvenida, sólo en busca de una muestra (que un n00b Java puede entender) que básicamente me permitirá conectar mi front-end con el resto de los servicios creados por ROO.

Gracias J

¿Fue útil?

Solución

Consulte el Modelo, Vista, Presentador patrón - Soluciona este problema. En general, toda la lógica no visualización debe mantenerse fuera de sus puntos de vista de modo que la lógica 1) la no visualización se puede unidad de prueba sin ejecutándose dentro de una diferente (lenta para crear una instancia) del navegador y 2) pantallas pueden ser enchufados en la misma aplicación sin duplicar la lógica no visualización.

Aquí hay un ejemplo MVP exhibiendo la comportamiento que usted está buscando (nota que el estilo es ligeramente diferente de las Actividades y lugares de ejecución).

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

Y en el módulo de GIN: bind(MyPresenter.Display.class).to(MyView.class);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top