使用Javascript获取支持bean值

使用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

JSF2.0、Mojarra 2.0.1、PrimeFaces 3.4.1

有类似的问题,但我需要其他东西;javascript函数必须等待backingbean方法,该方法正在填充希望从js函数中提取的变量。我想说的是:

<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>