위젯이 있습니다. 나는 다음과 같이 이벤트를 발생 싶습니다 :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/하지만 지금까지 행운이 없습니다. 도와주세요.
하나의 IndicatorHandler 구현을 고수하고 글로벌 동작/이벤트가되도록하십시오. – masterdany88
그러면 해결책 1을 사용해야하고'GwtEvent' 대신 일반'Event'에서'IndicatorStartEvent'를 연장하는 것이 좋습니다. 내가 솔루션 2를 선호하는 이유는 우려를 적절히 분리하기 때문입니다. 나는 또한'FileUploadWidget'을 가지고 있고 위젯은'FileUploadStartEvent','FileUploadErrorEvent' 및'FileUploadFinishedEvent'를 발생시킵니다. 'FileUploadWidget'을 사용하는 내 발표자 또는 뷰는 이러한 이벤트를 처리 한 다음 예를 들어'NotificationEvent'를 발생시킵니다. 이 방법으로'FileUploadWidget'은 좀 더 일반적이고 더 쉽게 재사용 될 수 있습니다. –