如何解决在 Vaadin 框架中,如何获取客户端时区以用于呈现显示的第一页
从客户端获取时区的最新推荐方法是通过...
UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
extendedClientDetails.getRawTimezoneOffset();
extendedClientDetails.getTimezoneOffset();
});
但是这个方法在第一次被调用时不是同步的。这意味着我们不能使用时区信息来呈现显示给用户的第一页。
在呈现第一页之前(例如在会话初始化时)是否有解决方法来获取此信息?或者我可以以某种方式表明我希望 vaadin 在第一次创建会话时获取该信息?
解决方法
没有办法这样做,因为 Vaadin 需要有机会在浏览器中运行 JavaScript 才能找到该信息。作为一种解决方法,您可以实现任何依赖于信息的视图,以推迟呈现其实际内容,直到信息可用。
因此,您的观点可能是这样的:
@Route
public class MyView extends VerticalLayout {
public MyView() {
UI.getCurrent().getPage().retrieveExtendedClientDetails(details -> {
add(new Text("Your time zone offset: " + details.getTimezoneOffset()));
});
}
}
如果详细信息不可用,这最初只会显示一个空壳。它通常应该持续片刻,直到获取了扩展的详细信息,因此用户甚至可能不会注意到延迟。如果你想让它更明确,那么你可以同时显示一些临时的占位符内容,例如不确定的进度条。
UI.getCurrent().getPage().retrieveExtendedClientDetails(details -> {
removeAll(); // Remove spinner if it happened to be there
add(new Text("Your time zone offset: " + details.getTimezoneOffset()));
});
if (getComponentCount() == 0) {
// We only get here if the Text component wasn't added immediately
ProgressBar spinner = new ProgressBar();
spinner.setIndeterminate(true);
add(spinner);
}
,
我相信答案是否定的。浏览器不会在初始请求中提供该信息;只有在第一个响应返回到浏览器后才能执行 JS。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。