如何通过ajax刷新JSF填充的javascript变量

How can I refresh a javascript variable, populated by JSF, via ajax?

本文关键字:javascript 变量 填充 JSF 何通过 ajax 刷新      更新时间:2023-09-26

我想做以下事情:

  1. h:selectOneMenu中选择项目
  2. 通过ajax用新值更新backingbean
  3. 使用新值运行Javascript函数

不过,在以下代码中,alert(#{backingBean.derivedValue})仍然包含上次更改的值(即,当我选择"Two"时为0,选择"One"时为4,依此类推):

<h:form>
    <h:selectOneMenu value="#{backingBean.input1}">
        <f:selectItem itemLabel="One" itemValue="1"/>
        <f:selectItem itemLabel="Two" itemValue="2"/>
        <f:ajax render="@form" onevent="function(data) { if (data.status === 'success') { alert(#{backingBean.derivedValue}) }}"/>
    </h:selectOneMenu>
    Input value: #{backingBean.input1}
    Derived value: #{backingBean.derivedValue}
</h:form>

以及支持豆:

@ManagedBean
@ViewScoped
public class BackingBean {
    private int input1;
    private int derivedValue;
    public int getDerivedValue() {
        return derivedValue;
    }
    public void setDerivedValue(int derivedValue) {
        this.derivedValue = derivedValue;
    }
    public int getInput1() {
        return input1;
    }
    public void setInput1(int input1) {
        this.input1 = input1;
        derivedValue = input1 * 2;
    }
}

有办法做到这一点吗?(顺便说一句,我在这个网站上读过无数的线程,这些线程在某种程度上处理JSF/ajax/javascript协同工作,但不是这个特定的问题)

我成功地实现了这个答案中提出的解决方案,用Javascript获取backingbean值,该值使用PrimeFace的RequestContext在服务器端添加Javascript回调参数。

这是我的Facelets页面:

<h:form>
    <p:selectOneMenu value="#{backingBean.input1}">
        <f:selectItem itemLabel="One" itemValue="1"/>
        <f:selectItem itemLabel="Two" itemValue="2"/>
        <p:ajax oncomplete="afterLoad(xhr, status, args)"/>
    </p:selectOneMenu>
    <h:outputScript>
        function afterLoad(xhr, status, args) {    
          alert("Input * 2 = " + args.derived);
        }
    </h:outputScript>
</h:form>

这是我的支持豆:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
@ManagedBean
@ViewScoped
public class BackingBean {
    private int input1;
    private int derivedValue;
    public int getDerivedValue() {
        return derivedValue;
    }
    public void setDerivedValue(int derivedValue) {
        this.derivedValue = derivedValue;
    }
    public int getInput1() {
        return input1;
    }
    public void setInput1(int input1) {
        this.input1 = input1;
        derivedValue = input1 * 2;
        RequestContext.getCurrentInstance().addCallbackParam("derived", derivedValue);
    }
}

(我不知道这是否是集成JSF和D3的好解决方案。)

另请参阅

  • 使用Javascript获取backingbean值