2012-02-20 23 views
2

是否有可能延遲一些控件加載到xpage上?我可以延遲加載一個x頁面上的一些控件加載到頁面後

這就是問題所在:比方說,你有一個控件可以完成一個fultextsearch並在重複控制中顯示結果。此ft搜索可能需要很長時間,並且會使網頁加載處於等待狀態,直到搜索結果準備就緒。

我希望我的頁面能夠初始化加載大部分數據,並且一些「耗時」的控件應該在初始加載之後作爲特殊請求加載到頁面中。

用這種方式,用戶將立即看到網頁,但頁面上的一些數據稍後會加載,而不會使服務器處於等待狀態。

可能嗎?

回答

2

您可以將它們打包到面板中,並將其呈現狀態設置爲呈現=#{viewScope.pageFullyLoaded}。然後在onLoad事件中有一個XSP。 partialRefresh請求你在哪裏設置viewScope.pageFullyLoaded = true 有點醜但可行。現在,您可以將該代碼包裝到您自己的自定義控件中,以便您可以擁有「lazyGrid」,「lazyPanel」等。

+0

你的意思是我使用客戶端js的partialrefresh和服務器端JS設置VIEWScope? – 2012-02-20 11:47:20

+1

如果面板未呈現,XSP事件是否真的可以工作? – 2012-02-20 12:14:15

+0

這就是爲什麼你需要把它包裝在一個渲染的 – stwissel 2012-02-21 17:37:01

6

使用呈現的缺點是所有值綁定仍然會評估,即使相應的標記不會發送到該頁面。所以這裏的訣竅是確保組件直到你想要的時候才存在。

每個組件都有一個getChildren()方法。這返回一個可變列表組件,它有一個add()方法。這允許您在頁面加載時或稍後在事件期間即時將組件添加到頁面。爲了達到您要做的目的,您希望推遲添加「昂貴」的組件直到後續事件。

創建直接附加到視圖root()的事件處理程序,給它一個唯一的ID(例如「loadExpensiveComponentsEvent」,將其刷新模式設置爲partial,將刷新ID設置爲任何div或面板將包含搜索結果,並將其事件名稱設置爲任意事件(例如「loadExpensiveComponents」),這樣可以防止事件被實際的用戶行爲觸發,將事件的代碼設置爲將注入組件的SSJS

然後添加腳本塊)在頁面加載後觸發事件:

XSP.addOnLoad(function(){ XSP.firePartial(null,「#{id:loadExpensiveComponentsEvent}」) ; });

您的頁面將無需搜索結果組件加載。頁面完全加載後,將自動觸發組件注入事件。

有關如何編寫注入事件的指導,請打開已從現有頁面生成的Java文件,以查看需要注入的組件以及要將其值設置爲的內容。

+0

有趣的解決方案,謝謝 – 2012-02-21 10:23:01

0

不知道爲什麼我以前沒有想到這一點。 extlib中的動態內容控制實際上解決了這個問題。在客戶端加載頁面時,可以使用javascript和ssjs觸發onClientLoad。

我現在面臨的一個問題是,我已經在我的網站上使用了dcc,所以我需要在我的dcc中添加另一個dcc。這似乎有點bug。我已經將它報告給openNTF的extlib團隊。