通过调用 javaScript 函数来中断 Bean 方法?

interrupt a Bean-method by calling a javaScript function?

我想做的事情:

详情:

问题:

是否可以通过中断bean-function来启动javaScript功能?


编辑:

添加了一个示例 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();
  }
}

免责声明:答案中的代码将包含未经测试的 PrimeFaces 风格代码和 'pseudo code'。由于我没有 use/run IceFaces 也无意这样做,因此我不能(不会)测试代码并且只会提供 PrimeFaces 对应项作为(未经测试的)示例

回答

您似乎一直在尝试找到一个无法工作的技术解决方案。 JSF 不能 'pause' 东西,只会在被调用的 bean 方法的末尾 return 数据。您很可能被 IcesFaces 文档中的声明误导了

"Send immediately Javascript code to the client for evaluation and execution"

由于 JSF 的工作方式,这无法工作,而且它的英语不太好。开发人员应该声明类似

"Send Javascript code to the client at the end of the method call for immediate evaluation and execution"

立即意味着它不是一些 <script> .... </script> 被添加到页面并且可以通过例如一次又一次地执行调用脚本中定义的函数。这并不意味着您不能从 returned 脚本(实际上这就是我们将要使用的)

调用现有的 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

}

How to return javascript/call javascript from a bean 是 Whosebug 中现有的 Q/A。对于 IcesFaces 的对应部分,我参考了他们的文档。一个 PrimeFaces 示例是

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

但是在javascript的结尾你要call a server side method in a bean from javascript。与您在第一步中需要的相反。

PrimeFaces 示例

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

因为在调用 step2() 时你想要 pass parameters to the bean,你也需要实现它。

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

你可以在那里使用 javascript 变量(例如一个完整的 json 字符串在一个变量中)并且需要 process these variables (特别是看到最后的 'update' )