GWTP: события и вложенные презентаторы

У меня есть некоторые проблемы с событиями в GWTP.

У меня есть MainPresenter, который расширяет TabContainerPresenter. Этот докладчик связан с MainView, который содержит некоторые компоненты пользовательского интерфейса + некоторые com.gwtplatform.mvp.client.Tab : HomeTab, ContactTab и так далее.

Предполагается, что MainPresenter реагирует на некоторые события "MyEvent" MyEvent имеет соответствующий MyHandler и был создан в соответствии с этими передовыми методами http://arcbees.wordpress.com/2010/08/24/gwt-platform-event-best-practice/

Когда я запускаю событие из компонента пользовательского интерфейса MainView следующим образом:

MyEvent.fire(this, new MyEventContext(..));

Я правильно ловлю событие в MainPresenter.

Но когда я делаю то же самое в одном из «Tab Presenter», событие не перехватывается MainPresenter.

Например, в HomePresenter, который является «HomeTab» MainPresenter, когда я делаю

MyEvent.fire(this, new MyEventContext(..));

Я могу поймать событие из HomePresenter, но не из MainPresenter.

Есть идеи?


person user2147970    schedule 08.03.2013    source источник
comment
Какую версию ты используешь?   -  person Brandon    schedule 09.03.2013


Ответы (2)


Убедитесь, что вы соблюдаете эти правила:

  1. EventBus, который вы вводите в свое представление, — это com.google.web.bindery.event.shared.EventBus (а не com.google.gwt.event.shared.EventBus)
  2. В Presenter, обрабатывающем событие (HomePresenter или MainPresenter), зарегистрируйтесь на событие с помощью метода addRegisteredHandler внутри метода жизненного цикла onBind:

    @Override
    protected void onBind() {
        super.onBind();
    
        addRegisteredHandler(MyEvent.getType(), this);
    }
    

Я не знаю, в чем ваша конкретная ошибка, которую вы сделали. Чтобы помочь вам, я сделал краткое доказательство концепции, которое показывает, что события могут быть отправлено из ведущего с вкладками в TabContainerPresenter. Клонируйте этот проект и перейдите на страницу #!settingsPage. Вы увидите две кнопки «Fire true» и «Fire false», которые будут запускать события, которые будут перехвачены ApplicationPresenter.

person spg    schedule 08.03.2013
comment
Во-первых, позвольте мне поблагодарить вас за этот потрясающий POC, это отличная основа для понимания того, что пошло не так. - person user2147970; 12.03.2013

Во-первых, позвольте мне поблагодарить вас за этот потрясающий POC, это отличная основа для понимания того, что пошло не так. Я увидел, что на самом деле я не использовал GWTP в хорошем смысле.

Корневая проблема заключалась в том, что у меня было 2 разных eventBus. Я увидел это, попробовав

Log.info("eventBus: "+eventBus)

в MainPresenter и в HomePresenter. Журналы показали, что у них не было одного и того же хэш-кода.

Это было связано с тем, что иногда я напрямую обращался к EventBus, выполняя:

EventBus.Util.getInstance();

Принимая во внимание, что PlaceManager создан с помощью:

DelayedBindRegistry.bind(GWT.create(MyInjector.class))
person user2147970    schedule 12.03.2013