2013-11-25 71 views
0

我有一個包含表單不同部分的選項卡式面板。在一節中,用戶可以將子文檔添加到當前打開的文檔中。在第二部分中,給出了一個列表框,其中的選項是通過查看所有子文檔的視圖(通過當前文檔的ID進行過濾)動態生成的(通過@DbLookup)。此功能全部正常工作,但是,動態列表框選項存在問題。查看正在緩存/無法刷新的數據

當用戶添加一個新的子文檔,然後切換到下一個選項卡時,不會使用此新文檔更新列表框。如果他們保存/重新編輯主文檔或刷新頁面,則不會發生任何變化,用戶必須在返回到原始文件之前加載另一個XPage才能更新列表框。我試圖通過對頁面進行全面更新來解決這個問題,在@DBLookup調用中使用session.evaluate和「NoCache」,或者調用database.getView(「My view」)。refresh(),但沒有運氣。

還有一個類似的問題,我有一個重複控制,它使用子文檔視圖(再次通過主文檔ID過濾)作爲數據源。當用戶使用按鈕添加子文檔時,它會部分刷新重複 - 但不會顯示新的子文檔,直到頁面再次刷新(或離開頁面並返回)。

有沒有關於JSF生命週期/視圖數據緩存方式的重要信息?

回答

3

作爲第一個措施,我會添加另一個公式項目的列表框,它只是返回當前時間(@Now()應該工作)。這樣你就可以檢查列表框選項是否在第一時間刷新了更新。

如果選項刷新的很好,它確實清楚@DbLookup做了一些緩存,儘管我不知道任何默認的緩存邏輯。

至少一個測試,我會改變使用的NotesView對象,而不是@DbLookup的代碼,這樣的事情:

var nview = database.getView("someview"); 
var nc = nview.getAllEntriesByKey(currentDocument.getDocument().getUniversalID(), true); 
var a = []; 
var ve = nc.getFirstEntry(); 
while (ve) { 
    a.push(ve.getColumnValues().elementAt(0)); // value of first column 
    ve = nc.getNextEntry(ve); 
} 
return a; 

(我寫的代碼從存儲器中,可能有語法錯誤) 。

由於代碼僅適用於視圖條目,因此它應該比@DbLookup快。如果需要,你甚至可以做一個nview.refresh()。

+1

你的記憶力很好,朱利安。 :)我只會建議兩個更改。在'nc'賦值中,添加第二個參數'true'來強制完全匹配,並向'while'添加另一行:'ve = nc.getNextEntry(ve);'如果沒有這個額外的操作,'while '永遠不會退出。 ;) –

+1

所以真的!尷尬,我忘了.getNextEntry()。這樣的事情永遠不會發生(但我敢打賭它發生在我們所有人身上:-))。 我修復了代碼。感謝您的更正:-) –

+0

事實上,它發生在我們所有人身上。至少,這發生在我身上。 :) –