2016-07-28 2 views
0

У меня есть виджет. Я хотел бы стрелять событие следующим образом: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/, но пока не повезло. Пожалуйста помоги.

ответ

2

Это не работает, потому что ваш FileUploadWidget использует собственную EventBus и не GWTP один, который также используется во всех ваших Presenters.

Есть два решения:

  1. Не используйте fireEvent(new IndicatorStartEvent("Message")) но использовать eventBus.fireEvent(new IndicatorStartEvent("Message")) на нагнетаемой EventBus внутри вашего Widget.

  2. Добавьте IndicatorStartEvent обработчик вашего FileUploadWidget непосредственно вместо того, чтобы использовать addRegisteredHandler на вашем Presenter.

Я предпочитаю решение 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")); 
    } 
} 

В Presenter или быть точнее View, который использует ваш FileUploadWidget, вы добавляете обработчик непосредственно к 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

I» вы хотели бы придерживаться одной реализации IndicatorHandler, потому что это глобальное действие/событие. – masterdany88

+0

Тогда вам нужно использовать решение 1, и я бы рекомендовал расширить ваш 'IndicatorStartEvent' из общего' Event' вместо 'GwtEvent'. Причина, по которой я предпочитаю решение 2, состоит в том, что он правильно разделяет проблемы. У меня также есть «FileUploadWidget», и виджет запускает «FileUploadStartEvent», «FileUploadErrorEvent» и «FileUploadFinishedEvent». Мой презентатор или View respectivaly, который использует «FileUploadWidget», обрабатывает эти события, а затем запускает, например, «NotificationEvent». Таким образом, ваш файл FileUploadWidget более универсален и может быть легко использован повторно. –

Смежные вопросы