Xpages 如何使事件处理程序执行两个不同的操作?
我有一个字段中onChange事件的事件处理程序。我试图让它在字段中提供的键与现有文档匹配时显示Dojo对话框,但如果尚未使用该键,则让它在没有用户输入的情况下创建并保存新文档 以下是事件处理程序的代码:Xpages 如何使事件处理程序执行两个不同的操作?,xpages,Xpages,我有一个字段中onChange事件的事件处理程序。我试图让它在字段中提供的键与现有文档匹配时显示Dojo对话框,但如果尚未使用该键,则让它在没有用户输入的情况下创建并保存新文档 以下是事件处理程序的代码: <xp:eventHandler event="onchange" submit="true" refreshMode="norefresh" disableValidators="true" onComplete="XSP.openDialog('#{id:dialog1}')">
<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”未找到
在我决定如何自动创建文档之前,警报只是一个占位符。我觉得我错过了一些简单的事情。有更好的方法吗?谢谢。您的描述说您正试图显示一个“Dojo”对话框,但您的代码正在调用XSP.openDialog,这将打开一个ExtLib对话框。您是否使用了ExtLib对话框控件 如果它是一个Dojo对话框,则需要使用dijit.byId(“{id:dialog1}”).show()调用它。 我认为你在其他问题上走的是正确的道路,但不妨尝试一下:
- 创建一个带有脚本块的面板,该脚本块从viewScope(例如viewScope.keyExist)创建csjs变量
- onchange SSJS检查键是否存在,并设置viewScope变量。如果不存在,则调用创建新文档。面板上方的部分刷新
- 完成在scriptBlock中创建的部分刷新检查变量,并基于该值显示对话框
- 创建一个带有脚本块的面板,该脚本块从viewScope(例如viewScope.keyExist)创建csjs变量
- onchange SSJS检查键是否存在,并设置viewScope变量。如果不存在,则调用创建新文档。面板上方的部分刷新
- 完成在scriptBlock中创建的部分刷新检查变量,并基于该值显示对话框
- 查看。postScript()是一种更好的方法。这是一个SSJS,它的参数是一个可以解析为CSJS的字符串。因此:
@If(@IsError(noteID)) {
view.postScript("alert('Create and save new doc');");
} else {
view.postScript("XSP.openDialog('#{id:dialog1}');");
}
如果XSP.openDialog正常工作,请检查服务器上是否安装了扩展库。如果有,代码应该可以运行。view.postScript()是一种更好的方法。这是一个SSJS,它的参数是一个可以解析为CSJS的字符串。因此:
@If(@IsError(noteID)) {
view.postScript("alert('Create and save new doc');");
} else {
view.postScript("XSP.openDialog('#{id:dialog1}');");
}
如果XSP.openDialog正常工作,请检查服务器上是否安装了扩展库。如果有,那么代码应该可以工作。onComplete失败,因为它是以SSJS(#{javascript:/*服务器端代码*/})的形式编写的。警报和XSP是客户端。onComplete失败,因为它是以SSJS(#{javascript:/*服务器端代码*/})的形式编写的。alert和XSP是客户端。您也可以使用SSJS显示对话框:getComponent(“dialog1”).show();或者,您可以使用SSJS显示对话框:getComponent(“dialog1”).show();在这种情况下,你应该能够采纳Per Henrik的建议并在SSJS onchange中完成所有操作。在这种情况下,你应该能够采纳Per Henrik的建议并在SSJS onchange中完成所有操作。谢谢,@Paul。我忘了提到我在你的博客上找到了关于使用xp的部分:this.onComplete.:)我必须处理部分刷新才能使其正常工作,但现在当它(我想)尝试运行XSP.openDialog时,我遇到了一个错误:更新某些页面时出错:dlg未定义。我在代码中的任何地方都找不到“dlg”,因此我认为它在IBM代码中。还有其他想法吗?我最近才看到view.postScript!可能值得使用内置设计器搜索来查看dlg是否在NSF中的任何位置。代码中缺少“var”并不一定会引发编译时错误,但可能会引发运行时错误。我忘了提到我在你的博客上找到了关于使用xp的部分:this.onComplete.:)我必须处理部分刷新才能使其正常工作,但现在当它(我想)尝试运行XSP.openDialog时,我遇到了一个错误:更新某些页面时出错:dlg未定义。我在代码中的任何地方都找不到“dlg”,因此我认为它在IBM代码中。还有其他想法吗?我最近才看到view.postScript!可能值得使用内置设计器搜索来查看dlg是否在NSF中的任何位置。代码中缺少“var”不一定会抛出编译时错误,但会抛出运行时错误Hanks,Tommy。我后来发现了。谢谢,汤米。我后来发现了。