我使用此代码通过按钮单击源复制一些文档.我想阻止最终用户选择列,并希望只从视图面板中获取所有文档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)
将视图面板排除在等式之外:视图面板是一个组件,组件供用户与之交互; 如果用户与视图面板的交互(即"选择"文档)不会改变您希望复制的文档,请忽略视图面板(至少,出于此特定事件的目的).
如果您只想复制视图面板所绑定视图中显示的所有文档,请与视图面板关联的同一数据源进行通信.因此,假设您的数据源声明如下所示:
<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),该父级还包含将触发复制的任何组件(即按钮,链接)并引用其中的数据源视图面板.这样,视图面板和按钮都可以与相同的数据通信; 否则,只有视图面板知道数据源存在.