Отказ от ответственности: Код в ответе будет содержать непроверенный код во вкусе 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 в переменной) и вам нужно обработать эти переменные (особенносм. «обновление» в конце)