2

次のテスト XPage があります。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:panel id="pagePanel">
        <xp:text escape="true" id="didThePageCompile">
            <xp:this.value><![CDATA[#{javascript:var d = new Date();
return d.toLocaleString();}]]></xp:this.value>
        </xp:text>
        <xp:br></xp:br>
        <xp:button value="Label" id="button1">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="partial" refreshId="dialog1"
                onStart="XSP.openDialog('#{id:dialog1}')" 
                onComplete="XSP.closeDialog('#{id:dialog1}')">
            <xp:this.action><![CDATA[#{javascript:var agent = database.getAgent("runLongTime");
var response = agent.run();

// var d = getComponent("dialog1"); 
// d.show();
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dialog1" title="Test Dialog">This is a test dialog</xe:dialog></xp:panel>
</xp:view>

エージェント「runLongTime」は 10 秒間だけスリープします。これはうまくいきます。ボタンをクリックしても、ダイアログボックスが表示されません。ソースを確認したところ、正しいコードが生成されました。そのコードは、手動でコンソールに配置すると機能します。

エラーは発生せず、エージェントは正常に実行されます。また、refreshId を「pagePanel」に変更しようとしましたが、それでも同じです。

4

2 に答える 2

7

XSP.openDialog()XSP.closeDialog()それぞれが部分的なリフレッシュをトリガーします。XPages クライアント側 API には、複数の部分更新操作が並行して実行されるのを防ぐためのロジックが含まれています。これにより、ダイアログを表示するために更新を実行しようとすると、ボタン イベントが既に実行されているため、ダイアログが表示されなくなる可能性があります。

JSON-RPC (コントロール パレットでは「リモート サービス」と呼ばれます) をページに追加します。ボタンのサーバー イベント コードを RPC のメソッドに移動します。次に、ボタン イベントを純粋なクライアント側に変更できます: call XSP.openDialog()、次に RPC メソッドを呼び出し、そのメソッドの onComplete でダイアログを閉じます。これにより、現在発生している競合状態を防ぐことができます。

于 2013-02-11T14:50:14.437 に答える
0

私がここで見る限り、あなたは同じダイアログを開いたり閉じたりしようとしています。数日前、同じ問題が発生し、なぜこれが機能しないのか疑問に思いました。

最後にイベントを確認したところ、onStart と onComplete がほぼ同時に起動するという見事な結果で終了しました。

XSP.closeDialog イベントを呼び出す前に、タイムアウト (window.timeout) を挿入してみてください。

于 2013-02-12T15:00:05.667 に答える