GWT History.back () не запускается наValueChangeHandler

В моем приложении GWT есть кнопка «Назад», к которой я прикрепил обработчик событий, который вызывает History.back ().

eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() {
        public void onNext(PrevEvent prevEvent) {
            History.back();
            System.out.println("Token is" +History.getToken());

        }
    });

Когда событие запускается, я вижу, что токен URL изменяется в браузере, но History.getToken () сам печатает последний токен. Например, если токены были добавлены в порядке #A, #B, #C, когда я нажимаю предыдущий, когда я нахожусь в #C, URL-адрес изменяется на < strong> #B, но getToken сообщает свой #C. Я думаю, это вызывает проблему отсутствия вызова метода onValueChange, и, следовательно, мое приложение остается то же.

То же самое наблюдается, когда я пытаюсь использовать кнопку «Назад» в браузере. Я использую firefox, но поведение в других браузерах ничем не отличается.

В чем может быть причина?

Я считал, что History.back () также вызовет onValueChange (), теперь кажется, что только History.newItem () будет работать тогда можно будет делать эту работу. Поправьте меня, если я ошибаюсь. Я смущен. Как тогда обрабатывать предыдущие события кнопки?

       eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() {
        public void onNext(PrevEvent prevEvent) {
            History.back();
            System.out.println("Token is" +History.getToken());
            doPrev();
        }
    });


    private void doPrev(){
       System.out.println("Calling Previous Method");
 }

Где-то в моем приложении мой код с токеном текущей истории # Step3 запускает предыдущее событие. Итак, когда дело доходит до предыдущего события, я выполняю History.back () и ожидаю, что токен вернется на # Step2, и у меня есть такой метод onValueChange,

    public void onValueChange(ValueChangeEvent<String> event) {

    String token = event.getValue();

    if(token != null){
         presenter = null;

    if(token == "step1")
    {
        System.out.println("Step 1");
        //do Something

    }
    else if(token == "step2")
    {
        System.out.println("Step 2");
                    //do Something      
    }
            else if(token == "step3")
    {
        System.out.println("Step 3");
                    //do Something      
    }

person Napster    schedule 10.07.2012    source источник


Ответы (1)


Похоже, что History.back () занимает много времени (буквально, около 100 миллисекунд :))

Я написал код, чтобы проверить это:

    public void onModuleLoad()
{
    History.newItem("A");
    History.newItem("B");
    History.newItem("C");
    RootPanel.get().add(new Button("back", new ClickHandler()
    {

        @Override
        public void onClick(
            ClickEvent event)
        {
            System.out.println("After back click token is " + History.getToken());
            History.back();
            new Timer()
            {

                @Override
                public void run()
                {
                    System.out.println("After 100 millis token is " + History.getToken());
                }
            }.schedule(100);
        }
    }));
    History.addValueChangeHandler(new ValueChangeHandler<String>()
    {

        @Override
        public void onValueChange(
            ValueChangeEvent<String> event)
        {
            System.out.println("We handle ValueChangeEvent on History. Now token is " + History.getToken());
        }
    });
}

Вывод в Google Chrome был следующим

After back click token is C
After 100 millis token is C
We handle ValueChangeEvent on History. Now token is B
After back click token is B
We handle ValueChangeEvent on History. Now token is A
After 100 millis token is A
After back click token is A
We handle ValueChangeEvent on History. Now token is C
After 100 millis token is C

Это не тот ответ, который вам нужен, но он слишком велик для комментариев :)

person cardamo    schedule 10.07.2012
comment
Спасибо за ответ. У меня есть проблемы с опробованием вашего решения, тем не менее, если History.back () требует слишком много времени для выполнения и последующие шаги следуют до его выполнения, что вы думаете, является возможным решением этой проблемы? - person Napster; 10.07.2012
comment
В чем именно твоя проблема? История не запускает valueChangeEvent? - person cardamo; 11.07.2012
comment
Точно, History.back () не запускает valueChangeEvent! - person Napster; 11.07.2012
comment
Вы обрабатываете события так же, как в моем коде? Если нет, приложите, пожалуйста, свой код. Как видно из вывода History.back (), запускает события. - person cardamo; 11.07.2012
comment
Я добавил код выше. Я обрабатываю события примерно так же. В моем случае мой History.back () не запускает onValueChange. А в History.getToken () сразу после History.back () он печатает более ранний токен, из которого было вызвано предыдущее событие (из шага 3). То есть он все еще показывает step3, тогда как я ожидаю, что он будет изменен на step2 и вызовет onValueChange, чего не происходит. Я понимаю, что History.back () требует времени, чтобы действовать, поэтому как отложить это, чтобы мой onValueChange мог уловить это изменение в токене истории - person Napster; 11.07.2012
comment
Инициализируется ли gwt gistory вообще? Поле impl в классе History не равно нулю? - person cardamo; 12.07.2012
comment
Он инициализируется. История работает хорошо, когда я добавляю новые токены, onValueChange запускается на newToken, но проблема связана с History.back () - person Napster; 12.07.2012
comment
Последнее, что я могу предложить, это то, что функция DOM onhashchange была переопределена в каком-то другом месте. Вы используете чистый GWT без каких-либо фреймворков, которые могут предоставлять собственный механизм истории? - person cardamo; 12.07.2012
comment
Чистый GWT Framework и ничего больше. Нет jar, кроме GWT 2.4 dev - person Napster; 12.07.2012
comment
позвольте нам продолжить это обсуждение в чате - person Napster; 12.07.2012