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

问题描述 投票:0回答:1

我想做的事:

  • 我想从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();
  }
}
jsf icefaces
1个回答
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中现有的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')

© www.soinside.com 2019 - 2024. All rights reserved.