Java 在Vaadin框架中,如何获得客户端时区以用于呈现显示的第一个页面
从客户端获取时区的最新推荐方法是通过Java 在Vaadin框架中,如何获得客户端时区以用于呈现显示的第一个页面,java,vaadin,vaadin-flow,Java,Vaadin,Vaadin Flow,从客户端获取时区的最新推荐方法是通过 UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> { extendedClientDetails.getRawTimezoneOffset(); extendedClientDetails.getTimezoneOffset(); }); 但是,此方法在第一次调用时并不同步。这意味着我们不能使用时区信息来呈现
UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
extendedClientDetails.getRawTimezoneOffset();
extendedClientDetails.getTimezoneOffset();
});
但是,此方法在第一次调用时并不同步。这意味着我们不能使用时区信息来呈现显示给用户的第一页
在呈现第一页之前(例如,会话初始化时),是否有办法获取此信息?或者,我是否可以指出,我希望vaadin在首次创建会话时获取该信息?我认为答案是否定的。浏览器不会在初始请求时提供该信息;只有在第一个响应返回到浏览器后才能执行JS。因为Vaadin需要在浏览器中运行JavaScript来查找该信息,所以无法执行JS。作为一种变通方法,您可以实现依赖于信息的任何视图,以推迟呈现其实际内容,直到信息可用为止 因此,你的观点可以是这样的:
@Route
public class MyView extends VerticalLayout {
public MyView() {
UI.getCurrent().getPage().retrieveExtendedClientDetails(details -> {
add(new Text("Your time zone offset: " + details.getTimezoneOffset()));
});
}
}
如果详细信息不可用,那么最初只显示一个空shell。它通常会持续一段时间,直到获取扩展的详细信息,这样用户甚至可能不会注意到延迟。如果希望使其更明确,那么可以同时显示一些临时占位符内容,例如不确定的进度条
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);
}
这就是我目前正在做的,但我希望有一种方法可以告诉Vaadin将它们作为初始框架引导的一部分进行检索。在创建视图实例时,初始引导甚至不一定发生。