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

时间:2012-09-10 18:35:57

标签: xpages

我在字段中有一个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'。

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

3 个答案:

答案 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()

我认为你正处于另一个问题的正确道路,但也许可以试试这个:

  • 使用scriptBlock创建一个面板,该面板从viewScope创建一个csjs var(例如viewScope.keyExist)
  • onchange SSJS检查密钥是否存在并设置viewScope var。如果它不存在,请调用您的新文档。面板上方的部分刷新。
  • 在scriptBlock中创建的部分刷新检查var的onComplete,并根据该值显示对话框。