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

Pat*_*yer 0 xpages

我使用此代码通过按钮单击复制一些文档.我想阻止最终用户选择列,并希望只从视图面板中获取所有文档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);

}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ony 5

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

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

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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