XPages [TypeError] 异常 view.getNextDocument(curDoc)

XPages [TypeError] Exception at view.getNextDocument(curDoc)

这是我的设置:

在我的 XPage 中,我有一个嵌入式视图,可以在相邻的面板中打开一个文档。 单击视图中的文档 link 会在 viewScope 变量中设置文档的 UNID,并刷新面板。 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 上的同一个视图。

感谢您的见解

我修改了我的答案以使用 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 是否可能是您代码中视图中的最后一个文档?

实际上,这完全符合预期:-)

它与变量类型等无关。基本上,如果你想遍历一个视图,你需要设置 "starting" 点,在你的情况下你使用 curDoc = v.getFirstDocument(); 来设置。然后,当您想要下一个文档时,您可以使用 nextDoc = v.getNextDocument(curDoc);,即告诉它 return curDoc 之后的文档。这是自版本 4 中引入 LotusScript 以来后端对象一直工作的方式。无论您使用 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;
}

/约翰

问题已得到解答,只是想添加回收位,我相信其他人可以从中受益。

var v:NotesView = database.getView("ViewByYear");
//var curDoc:NotesDocument = doc.getDocument(); // not needed
var curDoc:NotesDocument = v.getFirstDocument(); // starting reference as explained by @John

while (curDoc != null){
  var nextDoc = curDoc.getNextDocument(curDoc); // to fetch the next document
  curDoc.recycle(); // recycle called to manage memory
  curDoc = nextDoc; // replacing/passing data between variables
}