使用Javascript获取支持bean值
JSF2.0、Mojarra 2.0.1、PrimeFaces 3.4.1 有类似的问题,但我需要其他东西;javascript函数必须等待backingbean方法,该方法正在填充希望从js函数中提取的变量。我想说的是:使用Javascript获取支持bean值,javascript,jsf,jsf-2,Javascript,Jsf,Jsf 2,JSF2.0、Mojarra 2.0.1、PrimeFaces 3.4.1 有类似的问题,但我需要其他东西;javascript函数必须等待backingbean方法,该方法正在填充希望从js函数中提取的变量。我想说的是: <p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/> 这是孩子的生日: @ManagedBean @ViewScoped public class StatusB
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/>
这是孩子的生日:
@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
}
@ManagedBean
@视域
公共类StatusBean{
公共整数大小=0;
List panelList=new ArrayList();
public void getStatuses(){
this.panelList=fillList();
this.size=panelList.size();//假设为3
}
//二传手
}
所以函数会将大小警告为0,这是它的初始值,而我们希望看到3
它是如何工作的:如果我将
@PostConstruct
注释添加到bean的头部,它肯定会得到正确的大小,因为bean在页面加载之前就已经构建好了。但这意味着冗余的进程,commandlink操作之后需要的值。那么如何推迟js函数呢?有什么想法吗?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>
函数afterLoad(){
警报(“#{statusBean.size}”);
}
根据具体的功能需求,可能会有更优雅的方式,但您没有告诉任何相关内容。例如,
RequestContext#execute()
,
,等等。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>
函数后加载(xhr、状态、参数){
警报(参数大小);
}
Mojarra 2.0.1非常古老。它已经三年多了。考虑升级。在当前的2.1.19版本中有很多错误修复和改进。@BalusC好的,我将回顾版本差异,两个答案都是正确的,并且都有效谢谢你和partlov,但我无法决定选择哪一个作为答案。我应该按照先到先得的原则选择吗?但服务器说你们一分钟前就回答了,但我最后一次看的时候,服务器说是partlov先回答的。是同一时间吗?只需选择一个对你最有帮助的时间。目前公布的答案并没有提供完全相同的信息。至于确切的应答时间点击,只需查看“应答”时间戳的工具提示。但你不应该在选择答案时考虑这一点。这只是模拟FGITW。您好,我有一个关于addCallBackParam
的问题。在第一次调用时使用afterLoad(xhr、status、args)
时,它可以完美地工作。但是,如果我想使用相同的getStatuses()
再次调用它,则在后加载方法中size
将变为未定义的。似乎它无法在第二次调用时正确添加回调参数。我对第二次调用的意思是:例如,用户添加了一个状态,afterLoad在此之后成功运行,但如果用户删除了一个状态,我定义了一个remotecommand
,它调用statusBean.getStatuses
,并且它有oncomplete=“afterLoad(xhr,status,args)
.BalusC,你是rock:)这是一个旧线程..但我有一个问题..如果我使用外部javascript文件,如何实现这一点?请帮助我。
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)"/>
<script type="text/javascript">
function afterLoad(xhr, status, args) {
alert(args.size);
}
</script>