GWT & GIN: come iniettare PlaceController in un widget utilizzando UIBinder
-
12-10-2019 - |
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);
}
}
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: