0

でサーバーアクションを実行していますp:commandButton。これらのアクションが完了したら、(非表示のフィールドを表示するために) フォームを更新し、ダイアログを表示します。非表示のボタンがあるパネルのみを更新しようとしましたが、効果は同じでした:

問題はdialog.show().、ダイアログ内で定義されたウィジェットとダイアログ自体が現時点では存在しないことです。そのため、JavaScript コードの実行が速すぎると、ダイアログの更新を伴う投稿が完了する前に、変更したいオブジェクトが DOM ツリーに存在しないため、例外が発生します。

私の最初の質問は、そのような状況を回避して 2 回目の更新を行うことは可能ですか? ダイアログをページと共に更新することはできませんか?

次に、最初の投稿に答えられない場合、2 番目の投稿が終了した後にコードを起動するにはどうすればよいですか? ダイアログ コンポーネントの更新が完了し、操作を実行するときは、単にコールバックが必要です。

    <p:commandButton id="doTask" value="Do task" widgetVar="doTaskButton"
        action="#{service.doTask}" update="@form"
        onclick="disableMainButtons()"
        oncomplete="async.showAsyncDialog()" />

HTTP シーケンス:

// button click
POST http://localhost:9080/myapp/order.xhtml 200 OK
// oncomplete launches dialog.show()
// I receive answer from COMET before the dialog to display it is shown
POST http://localhost:9080/myapp/channel/async 200 OK
// refresh triggered by dialog.show(), only now the dialog is shown and it's widgets are rendered
POST http://localhost:9080/myapp/order.xhtml 200 OK
4

1 に答える 1

0

プログラミングの観点からは美しくない回避策は、ダイアログがレンダリングされているかどうかを確認し、レンダリングされていない場合は手順を遅らせることです。それでもダイアログが表示されない場合は、もう一度遅らせるなどしてください。

waitForDialogRendered: function() {
    var visible = asyncDialog.jq.css('visibility') == 'visible';
    if (!visible) {
        setTimeout(waitForDialogRendered, 250);
        return;
    }
    runComet();
}

ダイアログがユーザーに表示されていなくても、それasyncDialog.jq.is(':visible')は返されません!true

それでも、そのようなコードを書く必要がなければ、私はもっと幸せになるでしょう。

于 2013-01-25T15:48:43.230 に答える