feuern Ich habe Widget. Ich möchte ein Ereignis wie folgt Feuer:GWT, wie Ereignis von Widget oder Composite mit EventBus von HandlerManager
fireEvent(new IndicatorStartEvent("Message"));
Aber es dosn't Arbeit.
Normalerweise verwende ich Moderator für diese (GWTP), aber jetzt würde Ich mag nur regelmäßigen Widget haben:
public class FileUploadWidget extends Composite {
MaterialFileUploader uploader = new MaterialFileUploader();
@Inject
public FileUploadWidget(String triggerId, EventBus eventBus) {
super();
initWidget(uploader);
Window.alert("TEST Start");
fireEvent(new IndicatorStartEvent("Message"));
}
}
Hier ist Code Ereignis:
public class IndicatorStartEvent extends GwtEvent<IndicatorStartEvent.IndicatorHandler> {
public static Type<IndicatorHandler> TYPE = new Type<IndicatorHandler>();
public interface IndicatorHandler extends EventHandler {
void onIndicatorProgressStart(IndicatorStartEvent event);
}
public interface IndicatorHandlers extends HasHandlers {
HandlerRegistration addStartIndicatorHandler(IndicatorHandler handler);
}
private final String message;
public IndicatorStartEvent(final String message) {
this.message = message;
}
public static Type<IndicatorHandler> getType() {
return TYPE;
}
@Override
protected void dispatch(final IndicatorHandler handler) {
handler.onIndicatorProgressStart(this);
}
@Override
public Type<IndicatorHandler> getAssociatedType() {
return TYPE;
}
public String getMessage() {
return this.message;
}
}
Das ist mein App-Moderator, dass Griff der Veranstaltung:
public class AppPresenter extends TabContainerPresenter<AppPresenter.MyView, AppPresenter.MyProxy> implements AppUiHandlers
, IndicatorStartEvent.IndicatorHandler {
@ProxyStandard
public interface MyProxy extends Proxy<AppPresenter> {}
public interface MyView extends TabView, HasUiHandlers<AppUiHandlers> {}
@Override
protected void onBind() {
super.onBind();
addRegisteredHandler(IndicatorStartEvent.getType(), this);
}
public void onAsyncCallFail(AsyncCallFailEvent event) {
// fireEvent is executed from: com.gwtplatform.mvp.client;PresenterWidget
fireEvent(new IndicatorStartEvent("Firing message"));
}
@Override
public void onIndicatorProgressStart(IndicatorStartEvent event) {
MaterialToast.fireToast("Indicator start: " + event.getMessage());
}
}
Wenn ich dieses Ereignis aus fe Feuer: AppPresenter
(Code oben) oder Gw tRESTY Filter/Rückruf ass folgen:
class ProgressIndicatorFilter implements DispatcherFilter {
private AssistedInjectionFactory factory;
private EventBus eventBus;
@Inject
public ProgressIndicatorFilter(AssistedInjectionFactory factory, EventBus eventBus) {
this.factory = factory;
this.eventBus = eventBus;
}
@Override
public boolean filter(Method method, RequestBuilder builder) {
builder.setCallback(factory.createProgressIndicatorCallback(method));
eventBus.fireEvent(new IndicatorStartEvent("Rest-Gwt Comunication started"));
return true;
}
}
Es funktioniert wie erwartet. Aber in diesen Arbeitsbeispielen verwendet es com.google.web.bindery.event.shared;EventBus
Das Feuerungsereignis funktioniert nicht von Widget, wo verwendet wird: com.google.gwt.event.shared;HandlerManager;Bus
Klasse. Diese Klasse Bus
erweitert com.google.web.bindery.event.shared.SimpleEventBus
, die die richtige EventBus
Klasse von com.google.web.bindery.event.shared;EventBus
erweitert.
So verwenden Sie die Methode FireEvent() des Widgets andere EventBus
.
Kann mir jemand dabei helfen?
Ich habe rot offiziellen und diese Anweisung: http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/ aber bisher kein Glück. Bitte helfen Sie.
Ich würde gerne bei einer IndicatorHandler-Implementierung bleiben, da es sich um eine globale Aktion/ein globales Ereignis handelt. – masterdany88
Dann müssen Sie Lösung 1 verwenden und ich würde empfehlen, Ihr 'IndicatorStartEvent' von dem generischen' Event' anstelle von 'GwtEvent' zu erweitern. Der Grund, warum ich Lösung 2 bevorzuge, ist, weil es Bedenken richtig trennt. Ich habe auch ein 'FileUploadWidget' und das Widget feuert' FileUploadStartEvent', 'FileUploadErrorEvent' und' FileUploadFinishedEvent'. Meine Presenter- oder View-Funktion, die das 'FileUploadWidget' verwendet, behandelt diese Ereignisse und löst dann beispielsweise ein' NotificationEvent' aus. Auf diese Weise ist Ihr 'FileUploadWidget' generischer und kann einfacher wiederverwendet werden. –