Question

Je suis en train d'accéder à certains objets à l'intérieur d'une interface utilisateur: composant liant, mais pas sûr de savoir comment accéder au EventBus, requestFactory, etc sans écrire de code méchant qui me garder éveillé toute la nuit (prendre note également que je suis complètement nouveau pour JAVA, une formation en Perl / Python / PHP).

Mon fichier 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>

Injecter la EventBus cette façon échoue avec com.ig.client.scaffold.ui.widget.R n'a pas de constructeur par défaut (zéro args).

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

Ainsi, selon le message d'erreur, je crée un UIFactory puis je reçois une erreur  ... '{style.entityComponent}> manquant attribut requis (s): EventBus Element ... (On dirait qu'il essaie de trouver le EventBus dans l'interface utilisateur. Liant stylesheet

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

De la lecture et la lecture et plus de lecture pour les deux derniers jours, je n'ai pas vu quelqu'un d'accéder directement au EventBus, requestFactory et historyController dans la vue liaison au ui: widget de liant qui a conduit à la conclusion qu'il est probablement pas une meilleure pratique de toute façon.

Soit de dire que je l'ai un ojet, Appelons-le proxy, proxy contient HandleButtonClick qui appelle ensuite eventBus.doSomething (). Comment faire pour l'ui je lie cet objet Proxy: widget de liant sans avoir à instancier ou sans avoir à passer autour de tous les widgets

?

Est-il possible de faire l'injection de GIN sur une interface, puis mettre en œuvre cette interface par classe R qui contiendra alors en quelque sorte les objets que je cherche?

Toute solution que le travail est la bienvenue, à la recherche d'un échantillon (que Java n00b peut comprendre) qui me permettra essentiellement de connecter mon front-end avec le reste des services créés par ROO.

Merci J

Était-ce utile?

La solution

Consultez la Modèle, Vue, modèle Présentateur - il permet de résoudre ce problème. En général, devrait être conservé toute logique non-affichage des de votre point de vue de telle sorte que 1) la logique non-affichage peut être testée sans unité en cours d'exécution à l'intérieur d'une (lente pour instancier) navigateur et 2) différent écrans peuvent être branchés sur la même application sans dupliquer la logique de non-affichage.

Voici un exemple de MVP présentant la le comportement que vous recherchez (notez que le style est légèrement autre que les activités et lieux de mise en œuvre).

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

Et dans votre module GIN: bind(MyPresenter.Display.class).to(MyView.class);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top