好的,这是我的问题。我有2位主持人:FirstPresenter(例如:abc.com#first)& SecondPresenter(例如:abc.com#second)。 SecondPresenter上有一个按钮&当用户点击该按钮时,FirstPresenter将弹出一条消息。
所以,这就是我所做的,我用eClipse创建了一个事件名MyEvent,eclipse生成了一个类MyEvent.java
在SecondPresenter上,我得到了:
private EventBus eventBus;
@Inject
public SecondPresenter(final EventBus eventBus, final MyView view,
final MyProxy proxy) {
super(eventBus, view, proxy);
this.eventBus=eventBus;
}
@Override
protected void onBind() {
super.onBind();
passMsgButton.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
MyEvent myEvent =new MyEvent();
myEvent.setMsg("hello");
SecondPresenter.this.eventBus.fireEvent(myEvent);
}
});
}
在FirstPresenter上,我得到了:
private final MyHandler myHandler=new MyHandler(){
@Override
public void onMy(
MyEvent event) {
// TODO Auto-generated method stub
Window.alert(event.getMsg());
}};
@Override
protected void onBind() {
super.onBind();
registerHandler(getEventBus().addHandler(MyEvent.getType(), myHandler));
}
如果FirstPresenter是嵌入在SecondPresenter中的嵌套演示者,那么上面的代码可以正常工作。但如果他们是2个独立的演示者,则上述代码不起作用。
为什么呢?我检查了Google doc&他们只是说EventBus可以调用Presenter,他们没有说它必须是嵌套的演示者,所以我认为EventBus可以调用任何分离的演示者。
我将private EventBus
更改为public EventBus
,但没有帮助。
我错过了什么?
修改
我改变了我的代码,它部分工作。我不确定我做得对,因为它仍有一些问题。
好的,在FirstPresenter上我实现了MyHandler&覆盖onMy方法
public class FirstPresenter extends
Presenter<FirstPresenter.MyView, FirstPresenter.MyProxy> implements MyHandler{
private final MyHandler myHandler=new MyHandler(){
@Override
public void onMy(
MyEvent event) {
// TODO Auto-generated method stub
Window.alert(event.getMsg());
}};
@ProxyEvent
@Override
public void onMy(MyEvent event) {
Window.alert(event.getMsg());
getView().getHtmlPanel().add(new Label("test"));
}
@Override
protected void onBind() {
super.onBind();
registerHandler(getEventBus().addHandler(MyEvent.getType(), myHandler));
}
}
当我单击SecondPresenter上的按钮(Webbrowser的第二个选项卡上的页面)时,我在第二个选项卡上看到了消息弹出窗口(即浏览器没有在焦点上显示第一个选项卡),但是当我点击时FirstPresenter(第一个标签页面)我没有看到Label("test")
?
为什么它可以调用Window.alert但是没有将Label添加到FirstPresenter上?
另外,如何让浏览器将焦点设置在FirstPresenter上(即显示第一个标签页)?
我错过了什么吗?
答案 0 :(得分:2)
问题在于,如果您有两个顶级演示者,则任何时候只有一个处于活动状态。
我想onBind()
的{{1}}方法尚未被调用,因此处理程序尚未附加到FirstPresenter
上的Event
。
它适用于嵌套的演示者,因为EventBus
同时处于“活动状态”。
您必须依靠ProxyEvent“唤醒Presenters