簡體   English   中英

在 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();
});

但是,此方法在第一次調用時不是同步的。 這意味着我們不能使用時區信息來呈現顯示給用戶的第一頁。

在呈現第一頁之前是否有解決方法來獲取此信息(例如,在初始化 session 時)? 或者我能否以某種方式表明我希望 vaadin 在首次創建 session 時獲取該信息?

沒有辦法這樣做,因為 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);
}

我相信答案是否定的。 瀏覽器不會在初始請求中提供該信息; 您只能在第一個響應返回瀏覽器后執行 JS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM