2016-07-28 5 views
0

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.

Antwort

2

Es funktioniert nicht, weil Ihr FileUploadWidget seine eigene EventBus und nicht GWTP man verwendet, die auch in allen Ihren Presenters verwendet wird.

Es gibt zwei Lösungen:

  1. nicht fireEvent(new IndicatorStartEvent("Message")) Verwenden Sie aber eventBus.fireEvent(new IndicatorStartEvent("Message")) auf dem injizierten EventBus Innenseite Ihres Widget verwenden.

  2. Fügen Sie den IndicatorStartEvent Handler Ihre FileUploadWidget direkt statt addRegisteredHandler auf Ihrem Presenter verwenden.

Ich ziehe Lösung 2: add verwendet

public class FileUploadWidget extends Composite { 
    MaterialFileUploader uploader = new MaterialFileUploader(); 

    @Inject 
    public FileUploadWidget(String triggerId) { 
     super(); 
     initWidget(uploader); 
     Window.alert("TEST Start"); 
     fireEvent(new IndicatorStartEvent("Message")); 
    } 
} 

In der Presenter oder genauer die View zu sein, die Ihre FileUploadWidget Sie einen Handler direkt an den FileUploadWidget: Ich

public class UploadView extends ViewWithUiHandlers<UploadUiHandlers> implements UploadPresenter.MyView,IndicatorStartEvent.IndicatorHandler { 

    @UiField 
    FileUploadWidget uploadWidget; 

    @Inject 
    public UploadView(final Binder binder) { 
     widget = binder.createAndBindUi(this);  
     uploadWidget.addHandler(new IndicatorStartEvent.Handler(),this); 
    } 

    public void onIndicatorProgressStart(IndicatorStartEvent event) { 
     MaterialToast.fireToast("Indicator start: " + event.getMessage()); 
    } 
} 
+0

Ich würde gerne bei einer IndicatorHandler-Implementierung bleiben, da es sich um eine globale Aktion/ein globales Ereignis handelt. – masterdany88

+0

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. –