这是我的设置:
在我的XPage中,我有一个嵌入式视图,可以在相邻的Panel中打开文档。
单击视图中的doc链接可在viewScope变量中设置doc的UNID,并刷新Panel。 UNID变量用于定义页面的数据源文档(doc
)。
现在在Button中,我想获得视图中下一个文档的句柄,但是当运行以下SSJS代码时,最后一行会出现错误:
var v:NotesView = database.getView("ViewByYear");
var curDoc:NotesDocument = doc.getDocument();
// curDoc = v.getFirstDocument(); /* if this line is uncommented the error does not occur */
if (curDoc==null) return(false);
var nextDoc = v.getNextDocument(curDoc);
错误消息为:Script interpreter error, line=11, col=32: [TypeError] Exception occurred calling method NotesView.getNextDocument(lotus.domino.local.Document) null
如果我取消注释注释行(将curDoc设置为视图中的第一个文档),则不会发生错误。
知道为什么会这样吗?如何从数据源生成的文档不同?无论如何,这个文档来自同一个嵌入在同一XPage中的视图。
感谢您的见解
答案 0 :(得分:0)
我已经修改了我使用NotesViewNavigator的答案:
var v:NotesView = database.getView("ViewByYear");
var curDoc:NotesDocument = doc.getDocument();
// curDoc = v.getFirstDocument(); /* if this line is uncommented the error does not occur */
if (curDoc==null) return(false);
var nav:NotesViewNavigator = v.createViewNavFrom(curDoc);
var entry:NotesViewEntry = nav.getNext();
if (entry == null) { return false; } // check to see if curDoc is last doc in view
var nextDoc:NotesDocument = entry.getDocument();
curDoc是否可能是您代码中视图中的最后一个文档?
答案 1 :(得分:0)
实际上,这与预期完全一致: - )
它与变量类型等无关。基本上,如果要遍历视图,则需要设置“起始”点,在这种情况下,使用curDoc = v.getFirstDocument();
。然后当你想要下一个文档时使用nextDoc = v.getNextDocument(curDoc);
,即告诉它在curDoc之后返回文档。自从LotusScript在版本4中引入后,这就是后端对象的工作方式。无论您使用的是LotusScript,SSJS还是Java,它都是相同的模式: - )
所以常见的模式是:
var v:NotesView = database.getView("ViewByYear");
var curDoc = v.getFirstDocument();
while(null != curDoc){
// Do some work with curDoc
curDoc = v.getNextDocument(curDoc);
}
现在,您可能听说过与遍历视图有关的内存注意事项。基本上,Domino通常会为您处理内存处理。但是,特别是在迭代大型文档集合时,您应该使用稍微不同的模式(您也可以将其用于小型文档集合):
var v:NotesView = database.getView("ViewByYear");
var curDoc = v.getFirstDocument();
var nextDoc = null;
while(null != curDoc){
nextDoc = v.getNextDocument(curDoc);
// Do some work with curDoc
curDoc = null; // reclaim memory
curDoc = nextDoc;
}
/约翰