Javascript 获取notesxpdocument中的所有项目

Javascript 获取notesxpdocument中的所有项目,javascript,xpages,xpages-ssjs,Javascript,Xpages,Xpages Ssjs,在Notes数据库中,我在保存文档时执行审核。在LotusScript中非常简单。我从服务器获取原始文档(oDoc),然后在我修改的文档(mDoc)中,我执行Forall循环,以获取每个项目的名称;对于mDoc.items中的所有项。从oDoc中获取相同的项,执行一个函数,将新项作为参数,该函数将运行一个case语句,以查看它是否是我们关心的字段。如果是这样,我会在文档中用“何时”、“谁”、“什么字段”和“新值”更新一组列表值 我在服务器端脚本中执行此操作。在尝试这个过程中,我发现了一些有趣的事

在Notes数据库中,我在保存文档时执行审核。在LotusScript中非常简单。我从服务器获取原始文档(oDoc),然后在我修改的文档(mDoc)中,我执行Forall循环,以获取每个项目的名称;对于mDoc.items中的所有项。从oDoc中获取相同的项,执行一个函数,将新项作为参数,该函数将运行一个case语句,以查看它是否是我们关心的字段。如果是这样,我会在文档中用“何时”、“谁”、“什么字段”和“新值”更新一组列表值

我在服务器端脚本中执行此操作。在尝试这个过程中,我发现了一些有趣的事情

currentDocument是NotesXPDocument,它包含刚刚更改的所有内容

currentDocument.getDocument()包含更改前的值。它还返回一个NotesDocument,其中包含我可以运行的“items”字段

问题是,我需要在NotesXSPDocument中类似的东西。在迭代循环中是否有方法从中获取所有项的名称和值

这是坏代码。(目前它正在遍历NotesDocument项,但这些是旧值。我更愿意遍历XSP文档项)


您可以在提交后获得文档的两个版本—原始版本和包含以下内容的版本:

原始:
var-original\u-doc:NotesDocument=currentDocument.getDocument()

已更改:
var已更改\u doc:NotesDocument=currentDocument.getDocument(true)

通过这种方式,您可以比较项目的更改

但是,有一个陷阱:在将“changed_doc”分配给
currentDocument.getDocument(true)
之后,“original_doc”也有更改的值,因为两个变量都指向同一个文档。这就是为什么我们必须首先将所有项目从
currentDocument.getDocument()
复制到一个新的临时文档中,并且只有在使用
currentDocument.getDocument(true)
获取更改的值之后才可以。作为替代方案,您可以像在LotusScript中一样从服务器读取原始文档

这是一个用于检测已更改项目的代码,作为起点:

  var original_doc:NotesDocument = database.createDocument();
  currentDocument.getDocument().copyAllItems(original_doc, true);
  var changed_doc:NotesDocument = currentDocument.getDocument(true);
  var oItems:java.util.Vector = original_doc.getItems();
  var iterator = oItems.iterator();
  while (iterator.hasNext()) {
    var oItem:NotesItem = iterator.next();
    var itemName = oItem.getName();
    var cItem:NotesItem = changed_doc.getFirstItem(itemName);
    if (cItem.getText() !== oItem.getText()) {
        print("changed: " + itemName);
    }
    oItem.recycle();
    cItem.recycle();
  }
  original_doc.remove(true);
  original_doc.recycle();

您是否尝试过使用notesxpdocument的
getChangedFields()
?看看这里的用法,克努特,谢谢你。我不知道!似乎没法让它工作;在[xPages_SSJS.jss].FBAudit()处[xPages_SSJS.jss].FBAudit()处调用类型为“notesxpdocument[Static Java Wrapper,com.ibm.xsp.model.domino.wrapped.DominoDocument]”的对象的方法“getChangedFields()”时出错。saveDocument()123:}124:function FBAudit(){->125:var cFields=currentDocument.getChangedFields();126:print(cFields);127:}无法开始工作
getChangedFields()
但找到了使用
currentDocument.getDocument(true)
的解决方案-请参阅我的答案。true,但当您执行第二个状态时,原始文档中的值将采用更新文档中的值。至少在第二条语句之前,我先生成一个原始的_doc.getFirstItem,然后打印item.getText。它恢复了原始值。我在更新\u doc后粘贴相同的命令,它将从原始\u doc项返回新值。。。。。非常令人沮丧。这里正在进行某种继承。是的,我也发现了这一点,并用一种变通方法更新了答案:)
  var original_doc:NotesDocument = database.createDocument();
  currentDocument.getDocument().copyAllItems(original_doc, true);
  var changed_doc:NotesDocument = currentDocument.getDocument(true);
  var oItems:java.util.Vector = original_doc.getItems();
  var iterator = oItems.iterator();
  while (iterator.hasNext()) {
    var oItem:NotesItem = iterator.next();
    var itemName = oItem.getName();
    var cItem:NotesItem = changed_doc.getFirstItem(itemName);
    if (cItem.getText() !== oItem.getText()) {
        print("changed: " + itemName);
    }
    oItem.recycle();
    cItem.recycle();
  }
  original_doc.remove(true);
  original_doc.recycle();