【问题标题】:Can EventBus call a separated Presenter (not a nested Presenter) in GWTP?EventBus 可以在 GWTP 中调用分离的 Presenter(不是嵌套的 Presenter)吗?
【发布时间】:2013-07-11 10:56:04
【问题描述】:

好的,这是我的问题。我有 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 个独立的 Presenter,那么上面的代码就不起作用了。

为什么?我检查了谷歌文档,他们只是说 EventBus 可以调用 Presenter,他们没有说它必须是嵌套的 Presenter,所以我假设 EventBus 可以调用任何单独的 Presenter。

我将private EventBus 更改为public EventBus,但没有帮助。

我错过了什么?

编辑:

我稍微更改了我的代码,它可以部分工作。我不确定我做对了,因为它仍然存在一些问题。

好的,在 FirstPresenter 上我实现了 MyHandler & Override 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 上(即显示第一个选项卡)?

我错过了什么吗?

【问题讨论】:

    标签: gwt gwt-platform gwtp event-bus


    【解决方案1】:

    问题在于,如果您有两个顶级演示者,则任何时候只有一个处于活动状态。 我猜FirstPresenteronBind() 方法尚未被调用,因此处理程序尚未附加到EventBus 上的Event

    它适用于嵌套演示者,因为 Presenters 同时处于“活动状态”。

    你必须依靠ProxyEvent来“唤醒FirstPresenter

    【讨论】:

    • 嗨Ümit,非常感谢。我照你说的做了,但它部分起作用。我在回答中详细说明了,你能看看我是否遗漏了什么吗?
    • 浏览器的不同标签页之间无法直接通信。你必须依赖Messages (stackoverflow.com/questions/4079280/…)
    • 还是谢谢你
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2021-05-03
    相关资源
    最近更新 更多