Question

J'ai une sous-classe InlineLabel que j'ai utilisé dans UIBinder. Comment puis-je injecter un PlaceController dans via GIN, de sorte que le widget peut être utilisé dans UIBinder? (Rappelons que UIBinder a besoin d'un constructeur sans args.)

Si cela est impossible, quelle est la plus propre façon de faire un PlaceController à la disposition d'un widget pour qu'il puisse être utilisé par le widget lors d'événements onClick ()?

Modifier

Je ne suis pas sûr MVP est vraiment la meilleure solution dans ce cas (je suis heureux de vous changer d'avis, cependant.)

Je vais avoir des dizaines de ces instances de InlineLabel déclarées dans mon dossier de UIBinder foo.ui.xml. Si je mets en œuvre MVP, que des moyens déclarant chacun de ces cas, en tant que membres @UiField dans la vue. Cela devient plutôt difficile à manier quand j'ai beaucoup d'entre eux. Voilà pourquoi j'espérais injecter le PlaceController dans chacun des InlineLabels d'une manière semi-automatique, et évitez de les câbler manuellement dans la vue.

Il serait également acceptable s'il y avait un moyen d'injecter le présentateur dans chacun des InlineLabels ... alors la délégation pourrait être fait quelque chose comme:

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }
Était-ce utile?

La solution

Vous pouvez utiliser l'annotation @UiHandler pour ajouter un gestionnaire à un élément UiBinder sans avoir une référence @UiField:

<ui:UiBinder>
  <g:InlineLabel ui:field="name"/>
  <g:InlineLabel ui:field="address"/>
  <g:InlineLabel ui:field="zipCode"/>
</ui:UiBinder>

Et dans la vue:

@UiHandler({"name","address","zipCode"})
void onClick(ClickEvent event) {
  // Source will be one of the three InlineLabels.
  presenter.labelClicked(event.getSource());
}

Ne donnez pas votre widget une poignée directe à un PlaceController - délégué au présentateur de la vue (par un rappel ou une interface présentateur.). Voir http://code.google.com/webtoolkit/doc/latest/ DevGuideMvpActivitiesAndPlaces.html # Vues

Autres conseils

J'ai vu un exemple en ligne où des liens ont été construits directement à partir du nom des jetons utilisés par le PlaceController. par exemple.

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">
  <ui:with type="com.gwtplatform.samples.nested.client.NameTokens" field="nameTokens"></ui:with>
  <g:HTMLPanel>
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getHomePage}">Home</g:InlineHyperlink> | 
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getAboutUsPage}">About Us</g:InlineHyperlink> | 
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getContactPage}">Contact</g:InlineHyperlink>
  </g:HTMLPanel>
</ui:UiBinder>

Voir ici pour en savoir plus sur cet exemple:

http://code.google.com/p/ GWT-plate-forme / wiki / SimpleNestedSample # Step_3: _Creating_a_custom_widget

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