2016-07-15 24 views
1

Wie bekomme ich com.google.web.bindery.event.shared.EventBus Instanz in com.google.gwt.user.client.ui.Composite Erweiterungsklasse ?;Wie erhalte ich die EventBus-Instanz in der Composite-Erweiterungsklasse?

Ich habe mich gelesen: How to use EventBus for non-Presenter class in GWTP?, aber ich bin auf der Suche nach Antworten wie:

BEST WEGE ZUR ENTWICKLUNG GWT

I-Widget habe, Ich mag würde IndicatorEvent ein Ereignis ausgelöst. Aber in diesem Widget habe ich keinen Handler für dieses Ereignis.

Der Handler ist in einer anderen Klasse. So ist es abzufeuern ich verwenden:

fireEvent(new IndicatorEvent("Custom Widget Message")); 

Methode fireEvent ist avalible in com.google.web.bindery.event.shared;EventBus

public abstract void fireEvent(Event<?> event);

Also brauche ich eine Instanz von EventBus in Ansichtsklasse, die Composite erstreckt. Diese Ansicht hat kein MVP-Zeug (Moderatoren, Benutzerhandbücher usw.), es ist einfach ein Klassenelement/Widget.

Welchen Ansatz sollte ich wählen?

  • Sollte ich dies zu Presenter/View paar konvertieren? (In gwtp Moderatoren ist EventBus Referenz von PresenterWidget Klasse) Und dann mit ui Handler, delegieren Sie die Ausführung von der Ansicht an den Moderator?
  • Sollte ich inject Instanz von EventBus in Widget-Klasse?

Bitte helfen.

Antwort

0

Wir können nur eine einzelne Komponente pro Ansicht zuweisen. Die erste Annäherung macht also keinen Sinn, da wir viele Komponenten/Widgets für alle kleinen Abschnitte aus einer bestimmten Ansicht erstellen.

Der zweite Ansatz ist vergleichsweise sympathischer, wenn wir bereits ein Framework zur Abhängigkeitsinjektion wie Gin oder dagger2 verwenden.

Ich kann hinzufügen, ein weiterer Ansatz besteht darin, einfache Setter-Methode in der Komponente für die Übergabe eventBus-Instanz von der übergeordneten Klasse wie Presenter oder Controller, wo wir verwenden/erstellen Komponente Objekt haben.

Meine Schlussfolgerung wird es ist absolut abhängig von Zweck und Implementierung der Komponente. Wenn wir Interface-Implementierung oder Presenter-Implementierung Art von Komponente, die einige gemeinsame Verhalten, zweiten Ansatz ist am besten geeigneten Weg. Auf der anderen Seite, wenn wir eine einfache ebene Komponente haben, die nur ein kleiner Teil der Ansicht ist, werde ich einen dritten Ansatz empfehlen.

2

Jedes Widget kann ein Ereignis auslösen, ohne den EventBus zu verwenden.

Wenn Sie die Empfänger dieses Ereignisses kennen, können Sie die Handler einfach direkt an die Empfänger anhängen.Um dies zu erreichen, definieren Sie diese Methode in Ihrem Composite-Widget:

public HandlerRegistration addIndicatorEventHandler(IndicatorEventHandler handler) { 
    return addHandler(handler, IndicatorEvent.TYPE); 
} 

und dann in der anderen Widget (Empfänger):

myCustomWidget.addIndicatorEventHandler(new IndicatorEventHandler() { 

    @Override 
    public void onIndicator(IndicatorEvent event) { 
     // do something 
    } 

}); 

Sie müssen EventBus verwenden, wenn (a) es keine direkter/einfacher Link zwischen den beiden Widgets (feuerndes Ereignis und Ereignisempfänger), (b) es gibt viele Empfänger und/oder (c) Sie möchten keine Abhängigkeit zwischen Teilen Ihres Codes erzeugen, die Ereignisauslöser und Ereignis enthalten Empfänger.