版本:
Aapche MyFaces 2.1.14 RichFaces 4.3.5
问题:
我面临着JSF2.1
的非常奇怪的问题如末尾的代码片段所示,基于布尔变量#{bean.disabled}.
禁用布尔复选框
问题如下:
1)首先#{bean.disabled}
评估为false,因此启用了复选框。
用户单击复选框并提交表单(此处未显示表单)
2)操作方法设置disabled = true
和required= true
并再次呈现相同的页面
3)在此阶段,UI已单击并禁用复选框。在这个阶段,形式是
再次提交,bean.setRequired
方法调用setter值为FALSE
,而应将其设置为TRUE
4)当我创建disabled="#{false}"
时,此问题消失,并且使用setter值调用bean.setRequired方法为TRUE
所以问题是为什么即使UI在点击条件中显示复选框(也就是它的值为TRUE
),也会观察到步骤3中的行为,我还打印了
bean.required value并且仅评估TRUE
代码:
<h:panelGroup>
<h:selectBooleanCheckbox id="invite" disabled="#{bean.disabled}" value="#{bean.required}" />
<h:outputText value="Do Update"/>
</h:panelGroup>
答案 0 :(得分:3)
确保绑定到#{bean.disabled}
的支持属性是布尔值,而不是设置值"TRUE"
和"FALSE"
的字符串。
此外,您预期在步骤3中描述的行为。禁用该复选框后,提交的值将始终为false ,因为浏览器通常会在表单提交期间忽略已禁用的字段。要确保获得正确的值,请在复选框旁边保留一个隐藏字段,同时保持它们两者同步并使用隐藏字段的值来测试复选框是选中还是取消选中。如下所示:
<h:selectBooleanCheckbox id="invite" disabled="#{bean.disabled}" value="#{bean.required}" />
<h:inputHidden id="inviteHidden" value="#{bean.requiredHidden}" />
// While setting values, set values for both fields inside the action method
bean.setRequired(true); // ..or false
bean.setRequiredHidden(true); // ..or false
// And to test whether checkbox is checked, do...
if(bean.isRequiredHidden()) {
....
}
与您的问题无关,如果您使用<c:set/>
进行条件渲染,请考虑使用<a4j:outputPanel rendered = "#{someCondition}"/>
而在表单上提交更新(如果是AJAX提交。