JSF 2.0,Mojarra 2.0.1,PrimeFaces 3.4.1
有类似的问题,但我需要......其他; javascript函数必须等待支持bean方法,它正在填充想要从js函数中提取的变量。我想说的是:
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/>
假设js只是获取值并将其打印到屏幕上。
function afterLoad() {
alert("#{statusBean.size}");
}
这是生日小子:
@ManagedBean
@ViewScoped
public class StatusBean {
public int size=0;
List<Status> panelList = new ArrayList<Status>();
public void getStatuses() {
this.panelList = fillList();
this.size = panelList.size(); //Assuming 3
}
//getter and setters
}
因此函数将大小警告为0,这是它的初始值,而我们期望看到3.
它是如何工作的:如果我将@PostConstruct
注释添加到bean的头部肯定会得到正确的大小,因为bean已经在页面加载之前构建。但这意味着冗余进程,在commandlink操作之后只需要值。那么如何推迟js功能呢?有什么想法吗?
答案 0 :(得分:22)
JSF / EL和HTML / JS不同步运行。相反,JSF / EL在webserver中运行并生成HTML / JS,而HTML / JS又在webbrowser中运行。在浏览器中打开页面,右键单击查看源。你看,没有一行JSF / EL。它是一个和所有HTML / JS。代替你的JS函数,你会看到:
function afterLoad() {
alert("0");
}
在完成命令按钮操作时,会调用此JS函数。所以结果是完全可以预期的。
基本上,你想让JSF重新渲染那段JS。
<p:commandLink action="#{statusBean.getStatuses}" update="afterLoad" oncomplete="afterLoad()"/>
<h:panelGroup id="afterLoad">
<h:outputScript>
function afterLoad() {
alert("#{statusBean.size}");
}
</h:outputScript>
</h:panelGroup>
根据您没有说明的具体功能要求,可能会有更优雅的方式。例如,RequestContext#execute()
,<o:onloadScript>
等
答案 1 :(得分:10)
您的JavaScript中的EL是在呈现页面时计算的,您可以更新其容器(如果它在某个JSF组件中),但我建议采用另一种方法。
在进行AJAX请求时,可以在getStatuses()
方法中添加回调参数。您可以使用Primefaces的RequestContext
实用程序方法addCallBackParam()
:
public void getStatuses() {
this.panelList = fillList();
this.size = panelList.size();
RequestContext.getCurrentInstance().addCallBackParam("size", this.size);
}
你可以在xhtml中使用这个参数:
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)"/>
<script type="text/javascript">
function afterLoad(xhr, status, args) {
alert(args.size);
}
</script>