Xpages 如何使事件处理程序执行两个不同的操作?

Xpages 如何使事件处理程序执行两个不同的操作?,xpages,Xpages,我有一个字段中onChange事件的事件处理程序。我试图让它在字段中提供的键与现有文档匹配时显示Dojo对话框,但如果尚未使用该键,则让它在没有用户输入的情况下创建并保存新文档 以下是事件处理程序的代码: <xp:eventHandler event="onchange" submit="true" refreshMode="norefresh" disableValidators="true" onComplete="XSP.openDialog('#{id:dialog1}')">

我有一个字段中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”未找到


在我决定如何自动创建文档之前,警报只是一个占位符。我觉得我错过了一些简单的事情。有更好的方法吗?谢谢。

您的描述说您正试图显示一个“Dojo”对话框,但您的代码正在调用XSP.openDialog,这将打开一个ExtLib对话框。您是否使用了ExtLib对话框控件

如果它是一个Dojo对话框,则需要使用dijit.byId(“{id:dialog1}”).show()调用它。

我认为你在其他问题上走的是正确的道路,但不妨尝试一下:

  • 创建一个带有脚本块的面板,该脚本块从viewScope(例如viewScope.keyExist)创建csjs变量
  • onchange SSJS检查键是否存在,并设置viewScope变量。如果不存在,则调用创建新文档。面板上方的部分刷新
  • 完成在scriptBlock中创建的部分刷新检查变量,并基于该值显示对话框

您的描述说您试图显示一个“Dojo”对话框,但您的代码正在调用XSP.openDialog,这将打开一个ExtLib对话框。您是否使用了ExtLib对话框控件

如果它是一个Dojo对话框,则需要使用dijit.byId(“{id:dialog1}”).show()调用它。

我认为你在其他问题上走的是正确的道路,但不妨尝试一下:

  • 创建一个带有脚本块的面板,该脚本块从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。我后来发现了。谢谢,汤米。我后来发现了。