Domanda

Ho una sottoclasse InlineLabel che ho usato in UIBinder. Come posso iniettare un PlaceController in esso tramite GIN, in modo che il widget può essere utilizzato in UIBinder? (Ricordiamo che UIBinder richiede un costruttore senza args).

Se questo non è possibile, qual è il modo più pulito per fare un PlaceController a disposizione un widget in modo che possa essere utilizzato dal widget durante onClick () eventi?

Modifica

Non sono sicuro MVP è davvero la soluzione migliore in questo caso (sono felice di averti cambiare idea, però.)

I avrà decine di questi casi InlineLabel dichiarati nel mio file UIBinder foo.ui.xml. Se implemento MVP, che mezzi dichiarano ciascuno di questi casi come membri @UiField nella vista. Questo diventa piuttosto ingombrante quando ho tanti di loro. Ecco perché speravo per iniettare il PlaceController in ciascuno dei InlineLabels in modo semi-automatico, e evitano il cablarlo manualmente nella vista.

Sarebbe anche accettabile se ci fosse un modo per iniettare il presentatore in ciascuno dei InlineLabels ... poi la delegazione potrebbe essere qualcosa di fatto come:

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }
È stato utile?

Soluzione

È possibile utilizzare l'annotazione @UiHandler per aggiungere un gestore ad un elemento UiBinder senza avere un riferimento @UiField:

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

E nella vista:

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

Non dare il tuo widget di una maniglia diretto ad una PlaceController - delegato alla Presenter della visualizzazione (tramite un callback o un'interfaccia Presenter.). Vedere http://code.google.com/webtoolkit/doc/latest/ DevGuideMvpActivitiesAndPlaces.html # Visualizzazioni

Altri suggerimenti

Ho visto un esempio in linea in cui i collegamenti ipertestuali sono stati costruiti direttamente dal nome token utilizzato dal PlaceController. ad es.

<!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>

Vedi qui per maggiori informazioni su questo esempio:

http://code.google.com/p/ gwt-platform / wiki / SimpleNestedSample # Step_3: _Creating_a_custom_widget

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