У меня есть виджет. Я хотел бы стрелять событие следующим образом:GWT, как запустить событие из виджета или композиции с помощью EventBus из HandlerManager
fireEvent(new IndicatorStartEvent("Message"));
Но dosn't работу.
Обычно я использую Presenter для этого (GWTP), но теперь я просто хотел бы иметь регулярный виджет:
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"));
}
}
Вот код события:
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;
}
}
Это мое приложение предъявитель, что обрабатывать событие:
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());
}
}
Если я стрелять это событие из фе: AppPresenter
(код выше), или Gw tRESTY фильтр/обратный вызов:
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;
}
}
Работает должным образом. Но в этих рабочих примерах используется com.google.web.bindery.event.shared;EventBus
Событие стрельбы не работает из виджета, где используется: com.google.gwt.event.shared;HandlerManager;Bus
класс. Этот класс Bus
расширяет com.google.web.bindery.event.shared.SimpleEventBus
, который продлевает надлежащий класс EventBus
от com.google.web.bindery.event.shared;EventBus
.
Таким образом, метод виджета fireEvent() использует другие EventBus
.
Может ли кто-нибудь помочь мне с этим?
У меня есть красный чиновник и эта инструкция: http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/, но пока не повезло. Пожалуйста помоги.
I» вы хотели бы придерживаться одной реализации IndicatorHandler, потому что это глобальное действие/событие. – masterdany88
Тогда вам нужно использовать решение 1, и я бы рекомендовал расширить ваш 'IndicatorStartEvent' из общего' Event' вместо 'GwtEvent'. Причина, по которой я предпочитаю решение 2, состоит в том, что он правильно разделяет проблемы. У меня также есть «FileUploadWidget», и виджет запускает «FileUploadStartEvent», «FileUploadErrorEvent» и «FileUploadFinishedEvent». Мой презентатор или View respectivaly, который использует «FileUploadWidget», обрабатывает эти события, а затем запускает, например, «NotificationEvent». Таким образом, ваш файл FileUploadWidget более универсален и может быть легко использован повторно. –