GWT History.back()未触发onValueChangeHandler

时间:2012-07-10 06:01:35

标签: javascript gwt browser-history

我的GWT应用程序中有一个Previous按钮,我附加了一个调用 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 中点击上一个时,网址将更改为< 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      
    }

1 个答案:

答案 0 :(得分:3)

看起来像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());
        }
    });
}

谷歌浏览器的输出如下

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

这不是你想要的答案,但它太大而无法评论:)