2

我的 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中单击上一个时,URL 会更改为#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      
    }
4

1 回答 1

3

看起来 History.back() 需要很长时间(字面意思很长,大约 lOO 毫秒 :))

我写了一些代码来测试它:

    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

这不是您想要的答案,但是评论太大了:)

于 2012-07-10T10:21:16.387 回答