прервать Bean-метод, вызвав функцию javaScript? - PullRequest
0 голосов
/ 12 февраля 2019

Что я хочу сделать:

  • Я хочу вызвать функцию javaScript из функции Bean
  • Затем я хочу приостановить свою функцию Bean
  • Затем функция JavaScript делает свое дело и возвращает вещи обратно в bean-компонент
  • Затем функция-бин активируется и обрабатывает результат

Подробности:

  • Я использую JSF 2.2 и ICEfaces 4.2.0.
  • Я использую JavaScriptRunner.runScript () для вызова функции javascript.(Это хорошо работает)
  • Хорошо работает вызов функции bean из JavaScript
  • Согласно документам о JavaScriptRunner.runScript () функция должна "Немедленно отправить Javascriptкод клиента для оценки и выполнения "

Проблема:

  • Проблема в том, что функция javaScript не будет вызываться до завершения кода компонента.

Можно ли запустить функцию javaScript, прерывая функцию bean-компонента?


РЕДАКТИРОВАТЬ:

Добавлен пример Bean о том, как я, как думал, должен работать, если это поможет:

public class MyBean {

  public String callJavaScriptFunctionAndWaitAndHandleResult() {

    // Call a javascript function from the bean
    callJavaScriptFunction();

    // Waits untill the javascript has returned some stuff
    pause(); // <-- IS IT POSSIBLE TO WAIT HERE AND RUN A JAVASCIPT FUNCTION?

    // Handle the result you got from the javascript function
    handleResultFromJavaScript();
  }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Отказ от ответственности: Код в ответе будет содержать непроверенный код во вкусе PrimeFaces и в «псевдокоде».Поскольку я не использую / не запускаю IceFaces и не собираюсь этого делать, я не могу (не буду) тестировать код и предоставлю только аналоги PrimeFaces в качестве (непроверенного) примера

Ответ

Вы, похоже, застряли, пытаясь заставить работать техническое решение, которое не может работать.JSF не может «приостановить» работу и будет возвращать данные только в конце вызванного метода компонента.Скорее всего, вас вводит в заблуждение утверждение в документации IcesFaces

«Немедленно отправлять код Javascript клиенту для оценки и выполнения»

Это не может работать из-за способаJSF работает, и это не очень хороший английский.Разработчики должны были указать что-то вроде

«Отправить код Javascript клиенту в конце вызова метода для немедленное оценка и выполнение»

Непосредственное означает, что это не какой-то <script> .... </script>, который добавляется на страницу и может выполняться снова и снова, например, путем вызова функции, определенной в сценарии.Это не означает, что вы не можете вызывать существующие функции javasript (те, которые уже есть в вашем DOM) из возвращенного скрипта (фактически это то, что мы будем использовать)

Итак, как решить вашу проблему.Начнем с разбиения метода на две части, давайте назовем их step1 и step2

void step1() {

    // Do things

    // return javascript

}

void step2() {

    // Do other things using values that will be posted from the client by javascript

}

Как вернуть javascript / call javascript из компонента - это существующий Q / A здесь, в Stackoverflow.Для аналога IcesFaces я обращаюсь к их документации.Примером PrimeFaces является

PrimeFaces.current().executeScript("alert('This onload script is added from backing bean.'); clientSideFunction();");

Но в конце javascript вы хотите вызвать метод на стороне сервера в бине из javascript .В противоположность тому, что вам нужно на первом шаге.

Пример PrimeFaces:

<p:remoteCommand name="clientSideFunction" action="#{bean.step2}" />

И поскольку при вызове step2() вы хотите передать параметры в bean , вам также необходимо реализовать это.

clientSideFunction([{name:'x', value:10}, {name:'y', value:20}]);

Вы можете использовать там переменные javascript (например, полную строку json в переменной) и вам нужно обработать эти переменные (особенносм. «обновление» в конце)

...