在 Vaadin 框架中,如何让客户端时区用于呈现显示的第一页
In Vaadin framework, how can I get the client time zone to use in rendering the very first page displayed
从客户端获取时区的最新推荐方法是通过...
UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
extendedClientDetails.getRawTimezoneOffset();
extendedClientDetails.getTimezoneOffset();
});
但是这个方法在第一次调用时不是同步的。这意味着我们不能使用时区信息来呈现显示给用户的第一页。
在呈现第一页之前(例如,在初始化会话时)是否有解决方法来获取此信息?或者我能否以某种方式表明我希望 vaadin 在首次创建会话时获取该信息?
我相信答案是否定的。浏览器不会在初始请求中提供该信息;只有第一个响应返回到浏览器后才能执行 JS。
无法做到这一点,因为 Vaadin 需要在浏览器中 运行 JavaScript 才能找到该信息。作为一种解决方法,您可以实现任何依赖于信息的视图,以推迟呈现其实际内容,直到信息可用。
您的观点可能是这样的:
@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);
}
从客户端获取时区的最新推荐方法是通过...
UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
extendedClientDetails.getRawTimezoneOffset();
extendedClientDetails.getTimezoneOffset();
});
但是这个方法在第一次调用时不是同步的。这意味着我们不能使用时区信息来呈现显示给用户的第一页。
在呈现第一页之前(例如,在初始化会话时)是否有解决方法来获取此信息?或者我能否以某种方式表明我希望 vaadin 在首次创建会话时获取该信息?
我相信答案是否定的。浏览器不会在初始请求中提供该信息;只有第一个响应返回到浏览器后才能执行 JS。
无法做到这一点,因为 Vaadin 需要在浏览器中 运行 JavaScript 才能找到该信息。作为一种解决方法,您可以实现任何依赖于信息的视图,以推迟呈现其实际内容,直到信息可用。
您的观点可能是这样的:
@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);
}