2016-07-28 1 views
0

J'ai un widget. Je voudrais tirer un événement comme suit:GWT, comment déclencher un événement à partir d'un widget ou d'un composite à l'aide d'EventBus à partir de HandlerManager

fireEvent(new IndicatorStartEvent("Message"));

Mais ce dosn't travail.

Normalement, j'utiliser Presenter pour cela (GWTP), mais maintenant je voudrais juste avoir un widget régulier:

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")); 
    } 
} 

Voici le code d'événement:

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; 
    }  
} 

Ceci est mon application présentateur que gérer l'événement:

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()); 
    } 
} 

Si je tire cet événement de fe: AppPresenter (code ci-dessus), ou Gw tRESTY filtre/callback ass suivre:

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; 
    } 
} 

Cela fonctionne comme prévu. Mais dans ces exemples de travail, il utilise com.google.web.bindery.event.shared;EventBus L'événement de tir ne fonctionne pas à partir du widget, où est utilisé: com.google.gwt.event.shared;HandlerManager;Bus classe. Cette classe Bus étend com.google.web.bindery.event.shared.SimpleEventBus qui étend la classe EventBus appropriée de com.google.web.bindery.event.shared;EventBus. Par conséquent, la méthode du widget fireEvent() utilise d'autres EventBus.

Quelqu'un peut-il m'aider avec ceci?

J'ai rouge officiel et cette instruction: http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/ mais pas de chance jusqu'à présent. S'il vous plaît aider.

Répondre

2

Il ne fonctionne pas parce que votre FileUploadWidget utilise son propre EventBus et non GWTP qui est également utilisé dans tous vos Presenters.

Il y a deux solutions:

  1. Ne pas utiliser fireEvent(new IndicatorStartEvent("Message")) mais utiliser eventBus.fireEvent(new IndicatorStartEvent("Message")) sur le EventBus injecté à l'intérieur de votre Widget.

  2. Ajoutez le gestionnaire IndicatorStartEvent à votre FileUploadWidget directement au lieu d'utiliser addRegisteredHandler sur votre Presenter.

Je préfère la solution 2:

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")); 
    } 
} 

Dans le Presenter ou pour être précis le View qui utilise votre FileUploadWidget, vous ajoutez un gestionnaire directement à la FileUploadWidget:

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

Je Je voudrais coller avec une implémentation de IndicatorHandler, parce que c'est une action/un événement global. – masterdany88

+0

Ensuite, vous devez utiliser la solution 1 et je recommanderais d'étendre votre 'IndicatorStartEvent' du générique' Event' au lieu de 'GwtEvent'. La raison pour laquelle je préfère la solution 2 est parce qu'elle sépare correctement les préoccupations. J'ai également un 'FileUploadWidget' et le widget déclenche' FileUploadStartEvent', 'FileUploadErrorEvent' et' FileUploadFinishedEvent'. Mon présentateur ou View qui utilise le 'FileUploadWidget' gère ces événements puis déclenche par exemple un' NotificationEvent'. De cette façon, votre 'FileUploadWidget' est plus générique et peut être réutilisé plus facilement. –