Вопрос с порядком регистрации событий, отправки, получения и действий / мест - PullRequest
1 голос
/ 16 июня 2011

Я только что закончил свой первый собственный пример с мероприятиями / местами и MVP.все работает нормально, но некоторые события не отправляются и не принимаются должным образом, если я перехожу на другое место (из другого места).но на "moduleLoad", где это место установлено как место по умолчанию, все работает нормально.я думаю, что это не должно иметь значения, если место / действие запускается на moduleLoad (через historyHandler = new PlaceHistoryHandler (historyMapper); historyHandler.register (placeController, eB, defaultPlace); historyHandler.handleCurrentHistory ();) или через placeController.Goto (место);Не так ли?

с помощью отладки я проверил порядок регистрации событий, отправки событий и получения событий (все выполняется в начале (...) действия).проблема в том, что все получатели не получают событие, если start () выполняется через goTo (место) (регистрация и отправка работает нормально).Но если событие отправляется после start () или внутри start () - выполняется на moduleLoad, все работает отлично!

мой запуск активности выглядит так:

@Override
public final void start(final AcceptsOneWidget panel, final EventBus eventBus) {
// register events - to manipulate visibility of some display areas
eventBus.addHandler(SelectedEvent.TYPE, this);
//initiate presenters -(pseudo code)
[presenter that receives SelectedEvent]
[presenter that sends SelectedEvent]
//ading presenter's asWidgets to screen -> panel.setWidget..
...
}

@Override
public final void onSelected(final SelectedEvent event) {
   //do something
}

(вариант использования дляотправка этого события при запуске состоит в том, что я хочу сказать, что ничего не выбрано - полезная нагрузка события равна нулю)

проблема состоит в том, что ни метод докладчика, ни метод onSelected действия не вызывается, если start () вызывается черезидти к.Но во всех случаях (проверено отладчиком) регистрация события происходит перед его отправкой.что мне делать?

1 Ответ

2 голосов
/ 21 июня 2011

Javascript не является многопоточным.

Когда вы вызываете метод goTo (), ваши действия будут запускаться один за другим.Если вы инициируете событие внутри start (), оно будет отправлено до того, как будут запущены остальные действия.Таким образом, есть большая вероятность, что действие, обрабатывающее это событие, еще не было запущено (регистрация не была выполнена).

Вы можете решить свою проблему с помощью следующего кода:

Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
    @Override
    public void execute()
    {
        //Fire the event
    }
});

Планировщик - это служебный класс, предоставляемый GWT.ScheduleDeferred выполнит команду после возврата текущего цикла событий браузера.

Итак, вставив этот код в start (), вы знаете, что событие будет запущено, как только начнется каждое действие.

...