我在字段中有一个onChange事件的事件处理程序。如果字段中提供的密钥与现有文档匹配,我试图让它显示Dojo对话框,但是如果尚未使用密钥,则让它创建并保存没有用户输入的新文档。
这是事件处理程序的代码:
<xp:eventHandler event="onchange" submit="true"
refreshMode="norefresh" disableValidators="true"
onComplete="XSP.openDialog('#{id:dialog1}')">
<xp:this.action><![CDATA[#{javascript:var bundleID = getComponent("inputBundleID").getValue();
if (bundleID == "") {
return;
} else {
var noteID = @DbLookup(@DbName(),"AllBundlesID",bundleID,"$12");
if (@IsError(noteID)) {
viewScope.put("noteId","NEW");
} else {
viewScope.put("noteId",noteID);
}
};
document1.save();}]]></xp:this.action>
<xp:this.script><![CDATA[var bundleFieldId = '#{javascript:getClientId("inputBundleID")}';
var bundleId = document.getElementById(bundleFieldId).value;
if (bundleId == "") {
return false;
}
var trayFieldId = '#{javascript:getClientId("inputStorageTrayID")}';
var trayId = document.getElementById(trayFieldId).value;
if (trayId == "") {
alert('Storage Tray ID cannot be blank');
return false;
} else {
return true;
}]]></xp:this.script>
我尝试删除onComplete参数并在this.action部分下面添加:
<xp:this.onComplete><![CDATA[[#{javascript:if (viewScope.get("noteId") != "NEW") {
return XSP.openDialog('#{id:dialog1}');
} else {
alert('Create and save the document - TBD how to do it');
}}]]></xp:this.onComplete>
该代码给我错误[ReferenceError]'找不到XSP'。
警报只是一个占位符,直到我确定如何自动创建文档。我觉得我错过了一些简单的事情。有一个更好的方法吗?感谢。
答案 0 :(得分:3)
view.postScript()是一种更好的方法。这是SSJS,它将一个字符串作为参数,可以解析为CSJS。所以:
@If(@IsError(noteID)) {
view.postScript("alert('Create and save new doc');");
} else {
view.postScript("XSP.openDialog('#{id:dialog1}');");
}
如果XSP.openDialog工作正常,请检查服务器上是否安装了扩展库。如果有,那么该代码应该有效。
答案 1 :(得分:1)
onComplete失败,因为它被写为SSJS(#{javascript:/ *服务器端代码* /})。警报和XSP是客户端。
答案 2 :(得分:0)
您的描述显示您正在尝试显示“Dojo”对话框,但您的代码正在调用XSP.openDialog,这会打开一个ExtLib对话框。您是否使用ExtLib对话框控件?
如果是Dojo对话框,则需要使用 dijit.byId(“#{id:dialog1}”)来调用它.show()
我认为你正处于另一个问题的正确道路,但也许可以试试这个: