1

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

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

4

3 回答 3

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 正常工作,请检查您是否在服务器上安装了扩展库。如果有,该代码应该可以工作。

于 2012-09-10T20:56:21.987 回答
1

onComplete fail because it's written as SSJS (#{javascript:/* server side code */}). alert and XSP are client side.

于 2012-09-11T05:36:46.250 回答
0

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

如果是 Dojo 对话框,您需要使用dijit.byId("#{id:dialog1}").show()调用它

我认为您在解决其他问题方面走在了正确的道路上,但也许可以试试这个:

  • 创建一个带有 scriptBlock 的面板,该面板从 viewScope 创建一个 csjs var(例如 viewScope.keyExist)
  • onchange SSJS 检查 key 是否存在并设置 viewScope var。如果它不存在,请调用创建您的新文档。面板上方部分刷新。
  • 在 scriptBlock 中创建的部分刷新检查变量的 onComplete 并基于该值显示对话框。
于 2012-09-10T19:44:55.730 回答