0

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

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() {
    }
}

问题是它不会触发 ajax,<h:selectOneRadio>另一方面它在提交时工作得很好<h:commandButton>,这是为什么呢?我错过了什么?

4

1 回答 1

3

Ajax 更新在 JavaScript 中的工作方式大致如下:

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

但是,如果 JSF 组件不呈现其 HTML 输出,那么 HTML DOM 树中就没有可以找到和替换的内容。您需要将有条件呈现的 JSF 组件包装在始终呈现 HTML 表示的组件中,并改为更新它。该问题的公认答案完全正确。

也可以看看:


与具体问题无关,按值比较字符串(和一般对象)不应该通过compareTo()方法来完成,而是通过equals()

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

(顺便说一下,我会重命名isRenderedrendered,给它们加上前缀是没有意义的is

即便如此,完全在 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>
于 2013-06-11T17:57:12.503 回答