在javascript中使用backing bean值

时间:2014-01-28 08:29:26

标签: jsf-2 primefaces richfaces

   <h:form prependId="false" id="vt_sel_form">
         <p:panelGrid styleClass="center" columns="2">                     
                        <p:commandButton value="GO" oncomplete="alert(#{test.i})"  actionListener="#{test.testfxn()}" update="@this"/>
         </p:panelGrid>
    </h:form>

  import java.io.Serializable;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;

    @ViewScoped
    @ManagedBean(name = "test")

    public class TestClass implements Serializable {

        int i ;

        public int getI() {
            return i;
        }

        public void setI(int i) {
            this.i = i;
        }

        public void testfxn() {        
            setI(i++);
            //i=i+10;
            System.out.println("i" + i);
        }
    }

此处,alert(#{test.i})始终显示0.如何在单击commandButton时获得更改的支持bean值。 当我单击按钮两次时它会起作用。当我使用 a4j:commandButton 时它曾经正常工作。

2 个答案:

答案 0 :(得分:2)

这只是因为当commandButton 呈现时会评估alert(#{test.i});。您可以通过告诉JSF再次呈现脚本来查看更改的值:

<h:commandButton value="click me" action="#{testClass.testfxn()}">
    <f:ajax render="out" />
</h:commandButton>
<h:panelGroup id="out">
    <h:outputScript>
         alert(#{testClass.i});
    </h:outputScript>
</h:panelGroup>

答案 1 :(得分:0)

与您可以直接调用javascript函数的Richfaces不同,您需要将javascript函数设置为:

function_name(xhr, status, args)

使用列出的CommandButton作为示例:

 <p:commandButton value="GO" oncomplete="alert(#{test.i})"  actionListener="#{test.testfxn()}" update="@this"/>

在函数test.testfxn()中我们有:

public void testfxn(){    
RequestContext reqCtx = RequestContext.getCurrentInstance();
        i = i++;
        reqCtx.addCallbackParam("i", i);
}

这里,在从actionlistener调用支持bean的函数中,变量被添加到RequestContext。

现在在javascript函数中:

function draw(xhr, status, args) {
    console.log("We are into draw function");
    jsonString = JSON.parse(args.i); //json variable is taken out from args variable.
    console.log("The value of i "+ i);
}