我只是想知道......
当我点击刷新按钮时,尽管在客户端 - 服务器交互(回调)等期间修改了UI,但我的gwt应用程序仍然处于其默认UI状态...但有时如果用户单击刷新则“缓存”UI是非常必要的错误或重新打开用户仍登录的网页;
所以我的问题是...... 有没有办法以某种标准方式恢复gwt app UI(它的刷新前状态)?历史令牌可以帮助解决这类问题吗?
修改
关于history tokens我看到了这个例子:
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状态,好像没有点击刷新按钮。
EntryPoint ...
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状态不再重新生成它...
例如,如果我有这个UI(见图)我有兴趣在按下刷新按钮后完全相同...
但我不确定我应该寻找哪种方式?我还没有看到这个方向的任何gwt片段;所以我真的需要你的建议我应该采用哪种方式?
赞赏任何有用的评论
由于
P.S。 GWT 2.3
答案 0 :(得分:1)
我认为您错过了将状态存储到URL-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
}
的文档
或者你可以试试这个:https://github.com/jbarop/gwt-pushstate