Xpages 查看正在缓存/刷新失败的数据

Xpages 查看正在缓存/刷新失败的数据,xpages,lotus-domino,Xpages,Lotus Domino,我有一个选项卡式面板,其中包含表单的不同部分。在一个部分中,用户可以将子文档添加到当前打开的文档中。在第二部分中,它们被赋予了一个列表框,在该列表框中,通过查看所有子文档的视图(通过@DbLookup)动态生成选项,并根据当前文档的ID进行过滤。此功能都可以正常工作,但动态列表框选项存在问题 当用户添加新的子文档,然后切换到下一个选项卡时,列表框不会使用此新文档更新。如果他们保存/重新编辑主文档或刷新页面,则没有什么不同,用户必须在返回原始XPage之前加载另一个XPage,以便更新列表框。我试

我有一个选项卡式面板,其中包含表单的不同部分。在一个部分中,用户可以将子文档添加到当前打开的文档中。在第二部分中,它们被赋予了一个列表框,在该列表框中,通过查看所有子文档的视图(通过@DbLookup)动态生成选项,并根据当前文档的ID进行过滤。此功能都可以正常工作,但动态列表框选项存在问题

当用户添加新的子文档,然后切换到下一个选项卡时,列表框不会使用此新文档更新。如果他们保存/重新编辑主文档或刷新页面,则没有什么不同,用户必须在返回原始XPage之前加载另一个XPage,以便更新列表框。我试图通过对页面进行完整更新来解决这个问题,在@DBLookup调用中使用session.evaluate和“NoCache”,或者调用database.getView(“我的视图”).refresh(),但没有成功

还有一个类似的问题,我有一个repeat控件,它使用子文档的视图(同样由主文档ID过滤)作为数据源。当用户使用按钮添加子文档时,它会部分刷新repeat,但直到再次刷新页面(或离开页面并返回页面)后才会显示新的子文档


关于JSF生命周期/视图数据的缓存方式,我是否缺少一些关键的东西?

作为第一个衡量标准,我将向列表框添加另一个公式项,它只返回当前时间(@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()

作为第一个度量,我会在列表框中添加另一个公式项,它只返回当前时间(@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()

作为第一个度量,我会在列表框中添加另一个公式项,它只返回当前时间(@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()

作为第一个度量,我会在列表框中添加另一个公式项,它只返回当前时间(@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()

你的记忆力很好,朱利安我只建议两个改变。在
nc
赋值中,添加第二个参数
true
以强制精确匹配,并在
中添加另一行:
ve=nc.getNextEntry(ve)如果没有此附加操作,
while
将永远不会退出。;)真的!令人尴尬的是,我忘记了.getNextEntry()。这样的事情永远不会发生(但我敢打赌它发生在我们所有人身上:-)。我修正了密码。谢谢你的更正:-)事实上,这件事发生在我们所有人身上。好吧,至少,这件事发生在我身上。:)你的记忆力很好,朱利安我只建议两个改变。在
nc
赋值中,添加第二个参数
true
以强制精确匹配,并在
中添加另一行:
ve=nc.getNextEntry(ve)如果没有此附加操作,
while
将永远不会退出。;)真的!令人尴尬的是,我忘记了.getNextEntry()。这样的事情永远不会发生(但我敢打赌它发生在我们所有人身上:-)。我修正了密码。谢谢你的更正:-)事实上,这件事发生在我们所有人身上。好吧,至少,这件事发生在我身上。:)你的记忆力很好,朱利安我只建议两个改变。在
nc
赋值中,添加第二个参数
true
以强制精确匹配,并在
中添加另一行:
ve=nc.getNextEntry(ve)如果没有此附加操作,
while
将永远不会退出。;)真的!令人尴尬的是,我忘记了.getNextEntry()。这样的事情永远不会发生(但我敢打赌一定会发生)