我正在看这个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>
,为什么会这样?我错过了什么?
答案 0 :(得分:3)
Ajax更新在JavaScript中大致类似于这样:
document.getElementById(id)
按ID在HTML DOM中查找元素。但是,如果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>