【问题标题】:XPages [TypeError] Exception at view.getNextDocument(curDoc)XPages [TypeError] view.getNextDocument(curDoc) 异常
【发布时间】:2015-09-07 21:57:05
【问题描述】:

这是我的设置:

在我的 XPage 中,我有一个嵌入式视图,可以在相邻的面板中打开一个文档。 单击视图中的文档链接会在 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 上的同一个视图。

感谢您的见解

【问题讨论】:

  • P.S.:我只需要处理视图中当前选择/显示的文档之后的文档。类似于命令“NavigateNext”的东西会很棒。

标签: xpages xpages-ssjs


【解决方案1】:

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

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
}

【讨论】:

    【解决方案2】:

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

    它与变量的类型等无关。基本上,如果你想遍历一个视图,你需要设置“起始”点,在你的情况下你可以使用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;
    }
    

    /约翰

    【讨论】:

    • 谢谢,约翰。要清理内存,我应该使用 Recycle() ;) 但是,我仍然看不到是什么导致了我的代码中的错误。我正在为 getNextDocument 方法提供一个可以在视图中找到的文档。无论如何,我不想循环所有文档,我只想要当前显示的文档之后的文档。有没有简单的获取方法?
    • 不确定您是否需要 .recycle() 在 SSJS 中 - 我不再使用 SSJS ......但是当然,做你想做的事情很容易 - 我只是不明白你的问题。您只需省略 while 循环并执行您最初尝试的操作。但是您必须从视图中获取第一个文档才能获取“下一个”文档。这就是 getNextDocument 的工作方式... :-)
    【解决方案3】:

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

    【讨论】:

    • 不幸的是,这并不能解决问题。错误消息指出调用方法时发生错误(似乎在方法内部)。
    • 哦!我刚刚注意到您的新答案(在编辑旧答案之后)。我将对其进行测试,看看它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 2019-07-02
    • 2017-03-26
    • 2016-05-05
    • 2021-02-08
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多