GWT & GIN: Wie PlaceController in ein Widget mit UiBinder injizieren
-
12-10-2019 - |
Frage
Ich habe eine InlineLabel Unterklasse, dass ich in UiBinder verwendet. Wie kann ich ein PlaceController hinein über GIN injizieren, so dass das Widget in UiBinder verwendet werden? (Man erinnere sich, dass UiBinder ein No-args Konstruktor erfordert.)
Wenn das nicht möglich ist, was ist der sauberste Weg einen PlaceController zur Verfügung ein machen Widget, so dass es durch das Widget bei onClick () Veranstaltungen genutzt werden kann?
Edit:
Ich bin nicht sicher, MVP ist wirklich die beste Lösung in diesem Fall (Ich bin glücklich, Sie zu haben, meine Meinung zu ändern, aber.)
werde ich in meiner UiBinder foo.ui.xml Datei deklariert Dutzende dieser InlineLabel Instanzen haben. Wenn ich implementieren MVP, das bedeutet, jede dieser Instanzen als @UiField Mitglieder in der Ansicht zu erklären. Das wird ziemlich unhandlich, wenn ich so viele von ihnen haben. Deshalb habe ich gehofft, wurde die PlaceController in jede der InlineLabels in einer halbautomatischen Weise zu injizieren, und vermeiden, dass sie manuell in die Ansicht verdrahten.
Es wäre auch akzeptabel, wenn es eine Möglichkeit gäbe, die Moderatorin in jede der InlineLabels zu injizieren ... dann könnte die Delegation wie etwas getan werden:
public class MyInlineLabelSubclass {
// ...
public void onClick(ClickEvent event)
{
presenter.labelClicked(this);
}
}
Lösung
Sie können die @UiHandler
Anmerkung verwenden, um einen Handler zu einem UiBinder Elemente hinzuzufügen, ohne eine @UiField
Referenz mit:
<ui:UiBinder>
<g:InlineLabel ui:field="name"/>
<g:InlineLabel ui:field="address"/>
<g:InlineLabel ui:field="zipCode"/>
</ui:UiBinder>
Und in der Ansicht:
@UiHandler({"name","address","zipCode"})
void onClick(ClickEvent event) {
// Source will be one of the three InlineLabels.
presenter.labelClicked(event.getSource());
}
Geben Sie nicht Ihrem Widget einen direkten Griff zu einem PlaceController - Delegierten der Ansicht des Vortragende (über einen Rückruf oder eine Presenter-Schnittstelle.). Siehe http://code.google.com/webtoolkit/doc/latest/ DevGuideMvpActivitiesAndPlaces.html # Ansichten
Andere Tipps
Ich habe ein Beispiel online gesehen, wo Hyperlinks wurden direkt aus dem Namen gebaut Token von den PlaceController verwendet. zB.
<!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>
Sehen Sie hier für mehr auf dieses Beispiel: