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

时间:2019-02-12 11:11:02

标签: jsf icefaces

我想做什么:

  • 我想从Bean函数中调用javaScript函数
  • 然后我要暂停Bean功能
  • 然后JavaScript函数做自己的事情,并将东西返回给bean
  • 然后Bean函数唤醒并处理结果

详细信息:

  • 我正在使用JSF 2.2和ICEfaces 4.2.0。
  • 我正在使用JavaScriptRunner.runScript()调用javascript函数。 (效果很好)
  • 从JavaScript调用bean函数效果很好
  • 根据docs about JavaScriptRunner.runScript(),该函数应“立即将Javascript代码发送给客户端以进行评估和执行”

问题:

  • 问题是在bean代码结束之前不会调用javaScript函数。

是否可以通过中断bean函数来启动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();
  }
}

1 个答案:

答案 0 :(得分:2)

免责声明:答案中的代码将包含未经测试的PrimeFaces风格的代码和“伪代码”。由于我既不使用/运行IceFaces,也不打算这样做,因此我无法(不会)测试代码,而只会提供PrimeFaces的对应对象(未经测试)

答案

您似乎一直在努力寻求无法解决的技术解决方案。 JSF不能“暂停”事物,而只会在被调用的bean方法的末尾返回数据。您很可能会被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

}

如何return javascript/call javascript from a bean是Stackoverflow中的现有问答。对于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(尤其是最后看到的“更新”)