我想做什么:
详细信息:
问题:
是否可以通过中断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();
}
}
答案 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(尤其是最后看到的“更新”)