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.
Je Je voudrais coller avec une implémentation de IndicatorHandler, parce que c'est une action/un événement global. – masterdany88
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. –