这是我在SO上的第一篇文章。
我正在使用Richfaces4的JSF2,我有以下问题:
根据下拉菜单的值,我希望禁用面板中的某些输入字段,而不是必需的,否则应启用和需要这些字段。
我的xhtml中有以下内容
<h:selectOneMenu value="#{backingBean.field}" id="ResponseType">
<f:selectItems value="#{backingBean.responseTypes}" />
<f:ajax event="change" execute="@this" render="myPanel" listener="#{backingBean.responseTypeValueChange}" immediate="true"></f:ajax>
</h:selectOneMenu>
<rich:panel id="myPanel">
<h:inputText id="input1" label="label1" value="#{backingBean.input1}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input2" label="label2" value="#{backingBean.input2}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input3" label="label3" value="#{backingBean.input3}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input4" label="label4" value="#{backingBean.input4}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
</rich:panel>
我的支持bean是一个Spring bean,代码是:
public class BackingBean {
private boolean flagDisabled;
private String field;
// getters and setters
public List<SelectItem> getResponseTypes() {
...
// returns values [1: Positive], [2: Negative]
}
public void responseTypeValueChange(AjaxBehaviorEvent event) {
flagDisabled = "2".equals(field);
}
}
我的问题是,当调用responseTypeValueChange方法时,字段变量保存前一个请求的值。所以我总是得到完全相反的行为。
我也试过过a4j:ajax,但我得到了相同的结果。
然后我改变了方法,从事件参数中获取submittedValue,如下所示:
public void responseTypeValueChange(AjaxBehaviorEvent event) {
if (event.getSource() instanceof HtmlSelectOneMenu) {
HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
flagDisabled = "2".equals(source.getSubmittedValue());
}
}
以上是可行的,但我如何更新flagDisabled值,然后调用方法? 我觉得我的解决方案不是最好的。它实际上是一个黑客。
谢谢。
答案 0 :(得分:1)
经过这么多时间,在调查有关JSF验证的另一个问题时,我想出了如何在不使用以下内容的情况下正确调用该方法:
if (event.getSource() instanceof HtmlSelectOneMenu) {
HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
flagDisabled = "2".equals(source.getSubmittedValue());
}
在<h:selectOneMenu>
我添加了属性execute="@this"
,以便在ajax请求中仅包含此元素。
奇怪的是,我在这里的例子中有它,但在实际代码中没有。 对不起有关误导性帖子的人。
BTW:这与托管bean的范围无关。 bean是会话范围的,但我甚至创建了Spring的自定义View范围,甚至使用了JSF @ViewScope
而没有任何结果。