1

Этот вопрос основан только на заданном this (courtesy), но вопрос полностью перепутался с Java API EE 7 WebSockets, пытающийся показать фактический практический подход/сценарий, который в настоящее время вряд ли получит какой-либо ответ на основе <p:remoteCommand>.Вызов ap: remoteCommand с помощью функции JavaScript, передающей сообщение, локальное для этой функции, другой функции через обработчик «oncomplete»


Ниже приведен фрагмент 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> 

Предположим, что локальная переменная JavaScript message внутри функции test() присваивается сообщение JSON, который асинхронно получил через канал WebSockets.

notifyAll() функция в свою очередь, должен отправить сообщение с уведомлением (myMessage локальной для test() функции - собственно сообщение JSON, который получен ранее в функции test()) на другой канал WebSockets, который полностью игнорируется в этом вопросе для краткости ,


Можно ли передать значение var message = "myMessage" локальной по отношению к функции test() другой функции notifyAll() через oncomplete обработчик данного <p:remoteCommand>?

Объявление message в качестве глобальной переменной JavaScript может подавить функциональность WebSockets как сообщение получено асинхронно т.е. новое сообщение может быть принято в то время как обработка <p:remoteCommand> все еще продолжается/ожидание, чтобы закончить. Таким образом, объявление message в качестве глобальной переменной JavaScript не является вариантом.

.

ответ

1

Я не вижу лучшего способа, чем passing it as a parameter into the <p:remoteCommand> function, и из него извлекается функция 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 regex сложно с отрицательным lookbehind).

+0

Где находится данные? Я получаю 'undefined'. – Tiny

+0

Извините, я забыл бит '' в ответе. – BalusC

+0

Получение 'Uncaught ReferenceError: данные не определены'.Сгенерированный скрипт выглядит так: ' '. – Tiny