这是我在In a SSJS button I have got a NotesViewEntryCollection
上一篇文章的后续内容所以我有一个Go按钮,它从一个字段中获取一个值并返回一个viewEntryCollection,所以我看到我如何在dataContext中计算它。我把它添加到了我的页面:
<xp:this.dataContexts>
<xp:dataContext var="veCol">
<xp:this.value><![CDATA[#{javascript:var vw:NotesView = database.getView("vwCompanies");
var thisVeCol:NotesViewEntryCollection = vw.getAllEntriesByKey(viewScope.get("vsCompany"),false);
if (thisVeCol.getCount() == 0){
//get back to the page don't pass veCol probably need to do more than this
return "";
}else{
//the repeat is not rendered if false Go button does a partial refreash on the panelRepeat
//think it will need to a partial refresh on this dataContext as well
viewScope.put("vsDisplayRepeat", true);
return thisVeCol;
}}]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
然后我的重复只会绑定到veCol并且应该给我我想要的东西。我想我必须检查是否在此代码中设置了vsCompany。
现在我已经阅读了矛盾的陈述,因为序列化可以以这种方式使用dataContext来包含Notes对象。
这个概念会在实践中发挥作用吗?我的代码是否符合我的想法?
由于
答案 0 :(得分:3)
是和否。除了代码中的错误(你在早期的“getCount”之后缺少“()” - 我相信当前的表单将总是评估为false,因为它正在比较一个类(我想)到0,但谁知道SSJS?),该代码可能会按照您的预期进行。
然而,它可能会比你期望的更频繁地做到这一点,这对你的页面速度有害。 #{} - 在页面评估期间多次评估绑定的dataContexts。 Sven Hasselbach非常详细地介绍了这一点(http://hasselba.ch/blog/?p=1112),其结果是,使用它一次的页面的正常加载将计算三次,刷新可能是十一次。
$ {} - 绑定的dataContexts没有这个问题,因为每个XPage只评估一次,但它们确实会遇到你描述的序列化问题。可能最好的选择是切换到使用带有<xp:dominoView/>
的{{1}}数据源,或者,如果由于某种原因不切实际,请将视图条目数据预先读入categoryFilter
(使用OpenNTF API会更容易)。如果您执行后者,请注意List<Map<String, Object>>
s。