jsf - 通过调用 javaScript 函数来中断 Bean 方法?
问题描述
我想做的事:
- 我想从 Bean 函数调用 javaScript 函数
- 然后我想暂停我的 Bean 功能
- 然后 JavaScript 函数做它自己的事情并将内容返回给 bean
- 然后 Bean-function 唤醒并处理结果
细节:
- 我正在使用 JSF 2.2 和 ICEfaces 4.2.0。
- 我正在使用 JavaScriptRunner.runScript() 来调用 javascript 函数。(这很好用)
- 从 JavaScript 调用 bean 函数效果很好
- 根据有关 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();
}
}
解决方案
免责声明:答案中的代码将包含未经测试的 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 字符串)并需要处理这些变量(尤其是最后的“更新”)
推荐阅读
- javascript - 响应在为 Facebook 登录编写的脚本中返回为未定义
- java - 无法从 KafkaProducer 发布消息
- ios - 选择文本时iOS光标头被截断
- javascript - 比较javascript中的两个字符串
- vba - 将数据从一个 Excel 工作簿复制到另一个工作簿,同时保留格式
- javascript - 如何在动作处理程序中获取原始事件对象?
- r - 根据 R 中其他列中的重复值将值粘贴到数据框中
- node.js - Lambda 总是返回 200
- ios - 是否可以将 String 转换为 simd_float4x4 ?(iOS 12)
- google-apps-script - Google 选择器 API 错误:未找到服务器 IP 地址 n-utbhwlxa4witl3o3ev4uschzd37oxgge2qt73xy-0lu-script.googleusercontent.com