AJAX没有在JSF中触发

时间:2013-06-11 17:45:06

标签: ajax jsf

我正在看这个question并试图找到答案,我正在尝试,我制作了这段代码

JSF:

 <h:form id="form">
            <h:inputText id="text1" rendered="#{managedBean1.isRendered}"/>
            <h:outputLabel id="label1" rendered="#{!managedBean1.isRendered}" value="No"/> 
            <h:selectOneRadio value="#{managedBean1.option}"  >
                <f:selectItem itemValue="Yes" itemLabel="Yes" />
                <f:selectItem itemValue="No" itemLabel="No" />
                <f:ajax event="click" execute="@form" render="label1 text1" />
            </h:selectOneRadio>
        </h:form>

豆子:

@ManagedBean
@ViewScoped
public class ManagedBean1 implements Serializable {

    private boolean isRendered = false;
    private String option ;

    public void renderingMethod() {
        if(option.compareTo("Yes")==0) isRendered = true ;
        if(option.compareTo("No")==0) isRendered = false ;
    }

    public String getOption() {
        return option;
    }

    public void setOption(String option) {
        this.option = option;
    }

    public boolean isIsRendered() {
        return isRendered;
    }

    public void setIsRendered(boolean isRendered) {
        this.isRendered = isRendered;
    }


    /**
     * Creates a new instance of ManagedBean
     */
    public ManagedBean1() {
    }
}

问题是它没有触发<h:selectOneRadio>中的ajax,另一方面它可以正常使用提交<h:commandButton>,为什么会这样?我错过了什么?

1 个答案:

答案 0 :(得分:3)

Ajax更新在JavaScript中大致类似于这样:

  • 使用document.getElementById(id)按ID在HTML DOM中查找元素。
  • 用ajax XML响应中指定的新元素替换该元素。

但是,如果JSF组件没有呈现其HTML输出,那么HTML DOM树中就无法找到并替换它。您需要将有条件呈现的JSF组件包装在HTML表示始终呈现的组件中,然后更新它。这个问题的公认答案恰到好处。

另见:


对具体问题

无关,按值分析字符串(和一般对象)不应该由compareTo()方法完成,而应由equals()代替。

public void renderingMethod() {
    isRendered = option.equals("Yes");
}

(我将isRendered重命名为rendered,将is加上<{1}}

作为前缀是没有意义的

即使这样,在EL中完全完成它也会更容易,更少代码和更多自我记录。

<h:form id="form">
    <h:panelGroup id="group">
        <h:inputText id="text1" rendered="#{bean.option == 'Yes'}" />
        <h:outputLabel id="label1" rendered="#{bean.option == 'No'}" value="No" />
    </h:panelGroup>
    <h:selectOneRadio value="#{bean.option}"  >
        <f:selectItem itemValue="Yes" />
        <f:selectItem itemValue="No" />
        <f:ajax render="group" />
    </h:selectOneRadio>
</h:form>