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() はそれを行うためのより良い方法です。これは、CSJS として解析できる文字列をパラメーターとして受け取る SSJS です。そう:

@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

SSJS (#{javascript:/* server side code */}) として記述されているため、onComplete は失敗します。alert と XSP はクライアント側です。

于 2012-09-11T05:36:46.250 に答える
0

あなたの説明には、「Dojo」ダイアログを表示しようとしていると書かれていますが、コードは ExtLib ダイアログを開く XSP.openDialog を呼び出しています。ExtLib ダイアログ コントロールを使用しましたか?

Dojo ダイアログの場合は、dijit.byId("#{id:dialog1}").show()で呼び出す必要があります。

他の問題については正しい道を進んでいると思いますが、次のことを試してみてください。

  • viewScope (例: viewScope.keyExist) から csjs var を作成する scriptBlock を使用してパネルを作成します。
  • onchange SSJS は、キーが存在するかどうかを確認し、viewScope 変数を設定します。存在しない場合は、新しいドキュメントを作成してください。パネルの上の部分的な更新。
  • scriptBlock で作成された部分更新チェック変数の onComplete と、その値に基づいてダイアログを表示します。
于 2012-09-10T19:44:55.730 に答える