0

我只是想知道...

当我单击刷新按钮时,我的 gwt 应用程序会进入其默认 UI 状态,尽管它的 UI 在客户端-服务器交互(回调)等期间被修改了......但有时如果用户错误地单击刷新或重新打开了用户仍然登录的网页;

所以我的问题是......有没有办法以某种标准方式恢复 gwt 应用程序 UI(其刷新前的状态)?历史代币可以帮助解决此类问题吗?

编辑

关于历史令牌,我看到了这个例子:

History.addValueChangeHandler(new ValueChangeHandler<String>() {
      public void onValueChange(ValueChangeEvent<String> event) {
        String historyToken = event.getValue();

        // Parse the history token
        try {
          if (historyToken.substring(0, 4).equals("page")) {
            String tabIndexToken = historyToken.substring(4, 5);
            int tabIndex = Integer.parseInt(tabIndexToken);
            // Select the specified tab panel
            tabPanel.selectTab(tabIndex);
          } else {
            tabPanel.selectTab(0);
          }

        } catch (IndexOutOfBoundsException e) {
          tabPanel.selectTab(0);
        }
      }
    });

...我可以注意到它从历史中恢复了 tabIndex;如果选项卡面板不会通过模块加载(默认情况下)进行初始化,那么它会有所帮助吗?

//on button click...
    getSimplePanel().setWidget(new MyTabbedPane());

编辑

在这里更清楚的是我的测试代码,我试图弄清楚如何恢复 MainUI 我的意思是它以前的 UI 状态,就好像没有点击刷新按钮一样。

入口点...

public class Main implements EntryPoint {
    private SimplePanel simplePanel;
    public void onModuleLoad() {
        RootPanel rootPanel = RootPanel.get();

        FlowPanel flowPanel = new FlowPanel();
        rootPanel.add(flowPanel, 10, 10);
        flowPanel.setSize("410px", "280px");

        Button setWidgetButton = new Button("Click");
        setWidgetButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                getSimplePanel().setWidget(new MainUI());
            }
        });
        flowPanel.add(setWidgetButton);

        simplePanel = new SimplePanel();
        flowPanel.add(simplePanel);
    }
    protected SimplePanel getSimplePanel() {
        return simplePanel;
    }
}

...和复合材料;

public class MainUI extends Composite {
    private VerticalPanel verticalPanel;

    int index;
    public MainUI() {

        FlowPanel flowPanel = new FlowPanel();
        initWidget(flowPanel);

        Button button = new Button("+");
        button.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {             
                getVerticalPanel().add(new Label(""+(++index)+": "+Math.random()));
            }
        });
        flowPanel.add(button);

        DecoratorPanel decoratorPanel = new DecoratorPanel();
        flowPanel.add(decoratorPanel);

        verticalPanel = new VerticalPanel();
        decoratorPanel.setWidget(verticalPanel);

    }

    protected VerticalPanel getVerticalPanel() {
        return verticalPanel;
    }
}

...因此,通过从历史令牌中提取字符串并重新实例化对象或其他任何方式来“缓存” ui 状态而无需重新生成它...

例如,如果我有这个用户界面(见图),我有兴趣在按下刷新按钮后拥有完全相同的用户界面......

在此处输入图像描述

但我不太确定我应该寻找哪种方式?我在这个方向上没有看到任何 gwt 片段;所以我真的需要你的建议,我应该以什么方式挖掘?

任何有用的评论表示赞赏

谢谢

PS GWT 2.3

4

1 回答 1

1

我认为您错过了将状态存储到 URLs-Hashtag 中。

您可以使用 GWTP(如评论中所建议)

事实上,您需要阅读您的标签onModuleLoad并恢复您的状态。

这可能适用于getHash()

String state = Window.Location.getHash();
myRestoreStateFromTokenMethod(state);

更新

以下是创建推送商店的一些片段。

List<String> states = [...]

public void onClick(){ states.add("newState");changeHash(states); }


public void changeHash(){
    String hash = states.get(0) + ";"
    for(other states) hash += states.get(i);
    // use a UrlBuilder to set the Hash
}

UrlBuilder的文档

或者你可以试试这个:https ://github.com/jbarop/gwt-pushstate

于 2013-10-29T19:47:17.343 回答