首页 > 解决方案 > 通过调用 javaScript 函数来中断 Bean 方法?

问题描述

我想做的事:

细节:

问题:

是否可以通过中断 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();
  }
}

标签: jsficefaces

解决方案


免责声明:答案中的代码将包含未经测试的 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

}

如何从 bean 返回 javascript/调用 javascript是 Stackoverflow 中现有的问答。对于 IcesFaces 对应物,我参考了他们的文档。PrimeFaces 示例是

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

但是在 javascript 结束时,您想从 javascript 调用 bean 中的服务器端方法。与您在第一步中需要的相反。

一个 PrimeFaces 的例子是

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

并且由于在调用step2()时您想将参数传递给 bean,因此您也需要实现这一点。

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

您可以在其中使用 javascript 变量(例如,变量中的完整 json 字符串)并需要处理这些变量(尤其是最后的“更新”)


推荐阅读