我有一个重复控件,其中包含一个按钮,用于处理用户选择的文档。我的第一个用例是删除。我检测用户是否选择了至少一个文档,如果没有,则使用view.postScript发布错误消息。
我想添加一个确认对话框,确认用户想要对文档执行操作(比如删除它们)但无法找到方法。
理想情况下,我想在目前的SSJS中完成所有这些操作。
我的代码如下,有一个存根,我想要求用户确认。
非常感谢任何帮助。
//Did the user select a document
var hasSelected:Boolean = false;
for (var id in SelectedDocs.getSelectedIDs()) {
hasSelected = true;
break
}
//If false then set a warning
if (hasSelected == false)
{
x="alert('Error\\n\\nPlease select one or more documents to delete.\\n\\n');";
view.postScript(x)
return
}
//If true then ask confirmation
if (hasSelected == true)
{
}
var rspView:NotesView = database.getView("(dbAllRpPCTasks)")
for (var id in SelectedDocs.getSelectedIDs()) {
//Get each selected doc
var doc:NotesDocument = database.getDocumentByID(id);
//Get child docs and delete them
var key:String = doc.getItemValueString("ID");
var dc:NotesDocumentCollection = rspView.getAllDocumentsByKey(key);
if (dc.getCount() != 0)
{dc.removeAll(true);}
//Delete the selected doc
doc.remove(true)
doc.recycle();
SelectedDocs.setSelectedState(id,false);
}
感谢所有建议。我在回答弗兰克的回答。尝试编写CSJS,确定用户是否选择了文档然后继续。
在CSJS中我的按钮的点击事件中,我有以下内容:
var dtList = document.getElementsByName("#{id:dataView1.getSelectedIds()}");
confirm("What is the length?" + dtList.length);
confirm("Can I get an item?" + dtList.item(0));
返回零长度,项目未定义。
答案 0 :(得分:1)
与LotusScript不同,XPage代码不能等待用户输入。可以把它想象为调用代理在服务器上运行并在其中添加UIWorkspace.prompt()(这将引发错误,因为不允许用户交互)。
最好的建议是将确认提示作为CSJS添加到用户最初点击的按钮,例如。
return confirm("Are you sure?");
如果他们选择了文件,他们会在继续之前被提示。如果他们没有,它可能会提示某些用户无论如何都要选择文档。很难对没有选择任何文件的用户的投诉表示同情,点击他们想要继续的文件,然后抱怨再次进行对话。
答案 1 :(得分:0)
一点理论 - 每个行动都可以有这些组合:
因此,您必须结合一个或多个动作来完成您想要做的事情。可用于链接呼叫的技术:
我对您的用例的建议是在事件的CSJS中检测(执行前)用户是否选择了任何文档(DOM操作)。如果没有,请使用return false;
来停止事件执行(在CSJS提示中有正确的解释)。
编辑:确切的用例 将您的用例划分为两个问题:条件和执行。
<强> 1。条件强>
你真的需要打电话给SSJS来获取这些信息吗?这取决于您使用什么来选择文档 - 您的SelectedDocs
对象是什么?在某些情况下,您可以将(字面上)所选文档的数量呈现给DOM(假设选择触发部分/完全刷新)并在调用SSJS之前在CSSJ中使用它。所以重新考虑你的需求/方法。
<强> 2。执行强>
它真的需要SSJS + CSJS + SSJS组合吗?我对此表示怀疑。
以下是基于SSJS(+ CSJS)的用例示例。它模拟50:50显示提示或删除文档的机会。您明白了,只需更新第一个操作组即可获得所选的计数。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xp_1="http://www.ibm.com/xsp/coreex">
<xp:button
value="Label"
id="button1">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="partial" refreshId="button1">
<xp:this.action>
<xp:actionGroup>
<xp:actionGroup>
<xp:executeScript
script="#{javascript:requestScope.docnum = @Integer( @Random() * 2 );}">
</xp:executeScript>
</xp:actionGroup>
<xp:actionGroup
condition="#{javascript:requestScope.docnum == 0;}">
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:view.postScript('alert("No documents selected...");');}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
<xp:actionGroup
condition="#{javascript:requestScope.docnum != 0;}">
<xp:executeScript
script="#{javascript:// delete documents}">
</xp:executeScript>
</xp:actionGroup>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:view>
答案 2 :(得分:0)
您是否尝试过使用简单操作按钮?我使用“确认操作”来验证用户没有意外点击按钮(遗憾的是这是一个常见问题)。接下来,我验证我的表单并在自定义消息区域(Thanks to Tommy Valand)中显示任何消息,但您可以使用正常的消息区域。
创建一个Action Group并将SSJS表达式(或EL)置于有条件的执行状态。在页面中显示消息而不是弹出窗口。