0

我通过使用 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);
        }
    }
}

据我所知,一切都好;你能告诉我问题出在哪里吗?

谢谢安杰洛

4

0 回答 0