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
}
这是我的设置:
在我的 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
}