我通过使用 MVP 模式来使用 GWT 2.4
我有这种情况:在一个演示者中(我们称它为 TreePresenter,因为它显示一棵树)我有以下代码:
display.getSelectedItem().addSelectionHandler(new SelectionHandler<TreeItem>() {
@Override
public void onSelection(SelectionEvent<TreeItem> event) {
....
evtBus.fireEvent(new SelectCategoryEvent(item.getText()));
.....
}
});
在我的 AppController 类中,我遇到了这种情况:
eventBus.addHandler(SelectCategoryEvent.TYPE, new SelectCategoryEventHandler() {
@Override
public void onSelectCategory(SelectCategoryEvent event) {
saveHistoryEvent(event);
}
});
当我在三个项目中选择一个项目时,该事件被指令正确触发
evtBus.fireEvent(new SelectCategoryEvent(item.getText()));
但是在我的 AppController 中,事件没有传播,我无法在代码中处理它
eventBus.addHandler(SelectCategoryEvent.TYPE, new SelectCategoryEventHandler() {
@Override
public void onSelectCategory(SelectCategoryEvent event) {
saveHistoryEvent(event);
}
});
谁能告诉我原因?
感谢 Angelo
我会给你一些细节;我为自己的历史管理建立了一个类;我建立了这个类:
public class GwtHistoryEventsMgr {
private Map<String, List<GwtEvent>> tknEvts;
private HandlerManager eventBus;
public GwtHistoryEventsMgr(HandlerManager evtBus){
tknEvts = new HashMap<String, List<GwtEvent>>();
this.eventBus = evtBus;
}
private void saveHistoryEvent( GwtEvent event ){
List<GwtEvent> eventi = null;
if( tknEvts.containsKey(History.getToken()) ){
eventi = tknEvts.get(History.getToken());
}else{
eventi = new ArrayList<GwtEvent>();
}
eventi.add(event);
tknEvts.put(History.getToken(), eventi);
}
public void addEvtHandlers(){
//Aggiungo gli handler
eventBus.addHandler(CustomEvent.TYPE, new CustomEventHandler() {
@Override
public void onEvent(CustomEvent event) {
saveHistoryEvent(event);
}
});
}
public List<GwtEvent> getTokenTransWidgetEvents(String token){
if( tknEvts.containsKey(token) ){
return tknEvts.remove(token);
}else{
return null;
}
}
}
然后在我的 AppController 构造函数中,我编写了以下代码:
public AppController(HandlerManager eventBus, StandardDispatchAsync dispatcher){
super(null);
this.eventBus = eventBus;
this.dispatcher = dispatcher;
//Gestione history
histMgr = new GwtHistoryEventsMgr(eventBus);
histMgr.addEvtHandlers();
}
这意味着我应该非常确定 AppController 将自己注册到我想要的事件中(注意:我强烈减少了代码......但所有代码都是我编写的方式)
然后,由于我使用了客户端反射,所以我使用了客户端反射,使用了这段代码(之后所有小部件都已初始化):
@SuppressWarnings("rawtypes")
private void generateHistoricalEvents(){
List<GwtEvent> eventi = hisMgr.getTokenTransWidgetEvents(History.getToken());
//Ci sono eventi....vuol dire back del browser cliccato
if( eventi != null ){
for (GwtEvent gwtEvent : eventi) {
this.eventBus.fireEvent(gwtEvent);
}
}
}
据我所知,一切都好;你能告诉我问题出在哪里吗?
谢谢安杰洛