你要做的第一件事是确认。与Lotusscript不同,您不能在脚本中间使用函数来打开确认对话框并获取答案。为此,我建议在执行脚本简单操作之前使用确认简单操作。
<xp:button
value="delete"
id="button1"
>
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:actionGroup>
<xp:confirm message="Are you certain?"></xp:confirm>
<xp:executeScript
script="#{javascript:doSomething();}"
>
</xp:executeScript>
</xp:actionGroup>
</xp:this.action></xp:eventHandler></xp:button>
编辑
在过去,我还用扩展库构建了自己的对话框,用SSJS填充文本,然后从对话框本身调用doWhatever()或close()。这不是最好的解决方案,因为它需要服务器更新才能获得字符串。正如保罗·威瑟斯所说,最好的解决方案是使用CSJS进行确认。但我还没有这样做。
/编辑
对于您的删除功能,我建议您获取要删除的文档,然后通过表单名称或您使用的任何机制来判断它是P文档还是C文档,然后删除单个文档,或者使用getAllDocumentsBykey()从视图中获取一个文档集,然后遍历所有文档,逐个删除它们。
var ky:java.util.Vector = new java.util.Vector();
ky.add("MainCat");
ky.add("subCat");
ky.add("subCat2");
var vw:NotesView = database.getView("vw_myView");
var docs:NotesDocumentCollection = vw.getAllDocumentsByKey(ky);
//... delete stuff...
//dont forget to recycle
发布问题编辑
我建议使用以下方法获取表单名称:
var getSelectedDoc = function(){
var vwPnl = getComponent("viewpanel");
var ids = vwPnl.getSelectedIds();
var id = null;
var doc:NotesDocument = null;
if(ids.length > 0){ //could use for loop var i = 0; i < ids.length;i++
id = ids[0]; //could pack all ids into java.util.ArrayList and return that list to work on further
//be warned that if the user selects a parent doc and those automatically deleted by it that you need a mechanism to check if the document was already deleted!
}
if(id != null){
doc = database.getDocumentByID(id);
}
return doc;
}
var doc = getSelectedDoc();
var formName = (doc == null)? null : doc.getItemValueString("form");
if(PDOC_FORM_NAME.equalsIgnoreCase(formName)){
deleteFunctionComplete(doc);
} else if (CDOC_FORM_NAME.equalsIgnoreCase(formName)){
deleteFunctionTwo(doc);
} else {
// uh-oh
}
这也允许您拥有文档,以防您想立即删除它。
编辑评论
如果Cdoc应删除多个文档,则是。你应该使用getAllDocumentsBykey,记住视图需要为它构建。我的意思是,如果你有一个只有一个类别的视图,就没有问题,只需插入字符串就可以了。如果您有一个包含三个类别的视图,则不能向getalldocs函数中输入只有两个值的向量,它必须是三个。因此,如果您想删除“mycomp”的所有内容,并使用下面的pdocs“Greg”“Sally”“Bob”,只需使用alldocsbykey(“myomp”),如果视图如下所示:
迈肯
---格雷格
---萨莉
---鲍勃
但是如果视图看起来像
波兰
---分枝杆菌属
------格雷格
------萨莉
------鲍勃
那么必须使用带有波兰和mycomp的a向量。“波兰”没有得到正确的文件--只是有时会遇到的麻烦和陷阱。
进一步澄清问题后编辑
我更喜欢这种循环样式来删除文档
var doc_temp:NotesDocument = null;
var doc_toDelete:NotesDocument = null;
var coll_docs:NotesDocumentCollection = ...; //get document collection
var doc_nextDoc = coll_docs.getFirstDocument();
while(doc_nextDoc != null){
doc_temp = doc_nextDoc; //set document to delete
doc_nextDoc = coll_docs.getNextDocument(doc_nextDoc); // set next document before deletion
try{
doc_temp.remove(true);//lots of errors can happen here, such as ACL settings
} catch(e) {
//handle, or just break
} finally{
if(doc_temp != null) try{doc_temp.recycle()} catch(e){}// try to recycle, could also cause errors
doc_temp = null;// for the sense of completeness
}
}
根据问题编辑进行进一步编辑
当然,您只删除了一个Pdoc,按照您的设置,您只返回了一个文档。您可以展开getSelectedDoc(),将所有选定的文档放入java.util.ArrayList或其他文件中,然后使用该ArrayList一次删除多个,但这可能会很危险,具体取决于您所做的操作,因为NotesDocument不可串行化。在这种情况下,我建议使用与getSelected文档相同的代码,使用for循环获取文档ID,获取文档,如果文档不为空,则删除。
apropos getAllDocumentsByKey(带矢量)
按照当前设置的方式,不需要Vector。
如果您有一个包含类别和子类别的视图,并且希望获取该子类别中的所有文档,则必须使用矢量来获取。如果您包含一个简单字符串或一个只有一个值的矢量,则不会返回子类别中文档。向量可以被认为是“cat1”、“subcat”、“furtSubCat”
此外,这里没有检查从文档返回的字符串是否为空。应该这样做。也没有检查DocumentCollection是否为空。这也应该做到。我的预期是,基于上述原因检索集合时会出现问题。