1

この質問は純粋にこの以前に寄せられた質問 (礼儀) に基づいていますが、Java EE 7 WebSockets API が実際の実用的なアプローチ/シナリオを示そうとすると、質問は完全に台無しになり、<p:remoteCommand>.


以下に JavaScript のスニペットを示します (これは単なるテスト シナリオです)。

<script type="text/javascript">
    function test() {
        var message = "myMessage";
        window["myFunction"]();
        // This is literally interpreted as a JavaScript function "myFunction()".
        // "myFunction()" in turn is associated with a <p:remoteCommand>.
    }

    $(document).ready(test);

    function notifyAll() {
        alert("notifyAll() invoked.");
    }
</script>

このtest()関数は、ページが読み込まれるとすぐに呼び出されます。これにより、以下<p:remoteCommand>がトリガーされ、別の JavaScript 関数が呼び出されます。つまり、前述のメッセージを単純に警告notifyAll()するハンドラーを使用します。oncomplete

<h:form>
    <p:remoteCommand process="@this"
                     name="myFunction"
                     actionListener="#{bean.listener}"
                     oncomplete="notifyAll()"
                     ignoreAutoUpdate="true"/>
</h:form>

message関数内のローカル JavaScript 変数にtest()、WebSockets チャネルを介して非同期的に受信される JSON メッセージが割り当てられているとします。

次に、notifyAll()関数は通知メッセージ (関数myMessageに対してローカルtest()- 実際には関数で以前に受信された JSON メッセージtest()) を別の WebSockets チャネルに送信する必要がありますが、これは簡潔にするためにこの質問では完全に無視されます。


指定されたのハンドラを介して、関数のvar message = "myMessage"localの値を別の関数に渡すことは可能ですか?test()notifyAll()oncomplete<p:remoteCommand>

messageグローバル JavaScript 変数として宣言すると、メッセージが非同期で受信されるため、WebSocket の機能が圧倒される可能性があります<p:remoteCommand>messageしたがって、グローバル JavaScript 変数として宣言することはできません。

.

4

1 に答える 1

2

それをパラメーターとして関数に渡し<p:remoteCommand>oncomplete関数をそこから抽出するよりも良い方法はありません。

function test() {
    var message = "myMessage";
    myFunction([{name: "message", value: message}]);
}

function notifyAll(data) {
    var message = decodeURIComponent(data.match(/&message=([^&]*)/)[1]);
    // ...
}
<p:remoteCommand name="myFunction" ... oncomplete="notifyAll(this.data)" />

引数はdataによって JS 関数スコープに既に挿入されておりoncomplete、XHR クエリ文字列を表しています。正規表現はそこからパラメーターを抽出します。正規表現は、パラメーターがクエリ文字列の先頭にあることは決してないと想定していることに注意してください。これは、常に JSF/PF 固有のパラメーターで始まるため、真であり、シンプルに保つことができます (JS 正規表現は、負の後読みでトリッキーです)。

于 2015-09-06T19:37:16.687 に答える