获取xPage容器控件中所有ID的列表

时间:2013-11-25 21:11:11

标签: xpages

我使用此代码通过按钮点击source来复制某些文档。我想阻止最终用户选择列,并希望只从视图面板中获取所有文档ID。不完全确定如何做到这一点,或者数据视图对我来说可能是更好的选择。

var viewPanel=getComponent("viewPanel1"); //get the componet of viewPanel
var docIDArray=viewPanel.getSelectedIds(); //get the array of document ids
for(i=0;i < docIDArray.length;i++){
var docId=docIDArray[i];

var doc=database.getDocumentByID(docId);
var db=session.getCurrentDatabase();
var newDoc:NotesDocument=doc.copyToDatabase(db);
newDoc.replaceItemValue("approved","No");
var id=newDoc.getUniversalID();
newDoc.save(true);

}

1 个答案:

答案 0 :(得分:5)

将视图面板排除在等式之外:视图面板是一个组件,组件供用户与之交互;如果用户与视图面板的交互(即“选择”文档)不会改变您希望复制的文档,请忽略视图面板(至少,为此特定事件的目的)。

如果您只想复制视图面板所绑定视图中显示的所有文档,请与视图面板关联的同一数据源进行通信。因此,假设您的数据源声明如下所示:

<xp:panel>
 <xp:this.data>
  <xp:dominoView var="allDocuments" viewName="($All)" />
 </xp:this.data>
 <xp:viewPanel value="#{allDocuments}">
 ...

...然后只是遍历同一个视图:

allDocuments.setAutoUpdate(false);
var eachDoc = allDocuments.getFirstDocument();
while(eachDoc) {
 var newDoc = eachDoc.copyToDatabase(database);
 newDoc.replaceItemValue("approved", "No");
 newDoc.save();
 newDoc.recycle();
 var nextDoc = allDocuments.getNextDocument(eachDoc);
 eachDoc.recycle();
 eachDoc = nextDoc;
}
allDocuments.setAutoUpdate(true);

由于您复制了同一数据库中的文档,因此当事件结束时,视图面板将只显示两倍的文档,因为您复制了所有文档。当然,除非您要替换的项目值使他们不符合您正在显示的视图。

注意1:以上代码切换autoUpdate属性的原因是,除非您在迭代之前将其切换到false,否则当您复制每个文档时,如果新文档 显示在您正在迭代的视图中,索引器将会意识到它,并且您可能最终处于无限循环中,因为每次您尝试获取下一个文档时,它实际上是在你刚刚创建的副本上返回一个句柄...所以你基本上会无限复制相同的文档,直到抛出一些异常(即堆栈溢出,内存不足等)。禁用autoUpdate通过仅允许索引在您的例程开始时知道的条目的迭代来阻止这种情况。

注2:如果数据源仅在视图面板中定义 ,请将其移至父级(面板,自定义控件或XPage),其中包含任何内容组件将触发复制(即按钮,链接)并在视图面板中引用数据源。这样,视图面板和按钮都可以与相同的数据通信;否则,只有视图面板知道数据源存在。