2016-07-28 7 views
0

위젯이 있습니다. 나는 다음과 같이 이벤트를 발생 싶습니다 :GWT, HandlerManager에서 EventBus를 사용하여 위젯 또는 합성물에서 이벤트를 실행하는 방법

fireEvent(new IndicatorStartEvent("Message"));

그러나 그것은 일을 dosn't. 이벤트 코드 여기

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

:

일반적으로 나는이 (GWTP)에 대한 발표자를 사용하지만, 지금은 그냥 평범한 위젯을하고 싶은이 내 응용 프로그램의 발표자가

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를 이벤트를 처리 다음과 같이 필터/콜백을 수행하십시오.

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;EventBus에서 확장하는 com.google.web.bindery.event.shared.SimpleEventBus까지 확장됩니다.

그래서 위젯의 fireEvent() 메소드는 다른 EventBus을 사용합니다.

아무도 도와 줄 수 있습니까?

빨간 공식 및이 지시 : http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/하지만 지금까지 행운이 없습니다. 도와주세요.

답변

2

당신의 FileUploadWidget가 자신의 EventBus하고 또한 Presenters 모두에 사용하지 GWTP 하나 사용하기 때문에 그것은 작동하지 않습니다.

  1. fireEvent(new IndicatorStartEvent("Message"))를 사용하지만 Widget의 내부에 주입 된 EventBuseventBus.fireEvent(new IndicatorStartEvent("Message"))를 사용하지 마십시오 :

    는 두 가지 해결책이 있습니다.

  2. PresenteraddRegisteredHandler를 사용하는 대신 직접 당신의 FileUploadWidgetIndicatorStartEvent 핸들러를 추가합니다.

내가 솔루션이 선호 :에서

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 또는 FileUploadWidget, 당신은 FileUploadWidget에 직접 처리기를 추가 사용 View 정확하게는 : 나는 '

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

하나의 IndicatorHandler 구현을 고수하고 글로벌 동작/이벤트가되도록하십시오. – masterdany88

+0

그러면 해결책 1을 사용해야하고'GwtEvent' 대신 일반'Event'에서'IndicatorStartEvent'를 연장하는 것이 좋습니다. 내가 솔루션 2를 선호하는 이유는 우려를 적절히 분리하기 때문입니다. 나는 또한'FileUploadWidget'을 가지고 있고 위젯은'FileUploadStartEvent','FileUploadErrorEvent' 및'FileUploadFinishedEvent'를 발생시킵니다. 'FileUploadWidget'을 사용하는 내 발표자 또는 뷰는 이러한 이벤트를 처리 한 다음 예를 들어'NotificationEvent'를 발생시킵니다. 이 방법으로'FileUploadWidget'은 좀 더 일반적이고 더 쉽게 재사용 될 수 있습니다. –