我有一个标签面板,其中包含表单的不同部分。在一个部分中,用户可以将子文档添加到当前打开的文档中。在第二部分中,它们被赋予一个列表框,其中选项是通过查看所有子文档的视图动态生成的(通过@DbLookup),由当前文档的ID过滤。此功能都可正常工作,但动态列表框选项存在问题。
当用户添加新的子文档,然后切换到下一个选项卡时,列表框不会使用此新文档进行更新。如果他们保存/重新编辑主文档或刷新页面,它没有什么不同,用户必须加载另一个XPage才能返回原始文件以便列表框更新。我试图通过对页面进行全面更新来解决这个问题,在@DBLookup调用中使用session.evaluate和“NoCache”,或者调用database.getView(“我的视图”).skin(),但没有运气。
还有一个类似的问题,我有一个重复控件,它使用子文档视图(再次按主文档ID过滤)作为数据源。当用户使用按钮添加子文档时,它会部分刷新重复 - 但在页面再次刷新之前不会显示新的子文档(或者您离开页面并返回)。
关于JSF生命周期/缓存视图数据的方式,我是否缺少一些关键的东西?
答案 0 :(得分: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()。