0

我有一个禁用某些表单的复选框。

<h:selectBooleanCheckbox id="ldapAuthEnabled" value="#{enabled}" label="check it">

当我检查它时 - 它会导致禁用我的表单中的所有字段,以便:

<h:inputText mandatory="true" value="#{someVar}" 
disabled="#{!enabled}" required="#{enabled}" />

问题出现时

  1. 当字段未被禁用时,我会尝试保护我的表单 - 它会显示验证消息!
  2. 然后我点击复选框,它使所有字段都被禁用,但是 - 它仍然向我显示验证消息!因此,它甚至无法使用我的 controller.safe() 方法。

问题是:如何让它按预期工作?- 当字段被禁用时,无需保留验证消息并认为该表单无效。

- 编辑:

正如答案中所建议的(来自BalusC),我将“值”更改为“绑定”,所以现在我有这样的代码:

<h:panelGroup id="my-panel">

<h:selectBooleanCheckbox id="myEdit" binding="#{checkbox}" label="enable it!">
  <f:ajax event="click" render="my-panel"/>
</h:selectBooleanCheckbox>

<h:inputText id="name" value="#{bean.name}" disabled="#{not checkbox.value}" required="true" />
   <h:outputText value="sometext"/>                      
</h:panelGroup>

"<h:panelGroup id="my-panel">"“表格”的一部分在哪里。

但是有相同的结果 - 验证错误阻止我执行 save()。

我现在为我的 bean 使用“SessionScope”。

4

1 回答 1

3

具体的功能需求是合理的,但是到目前为止发布的代码是如此奇怪和不完整,以至于很难用它来解释具体的问题。到目前为止,您所做的理论上不起作用,因为模型值仅在更新模型值阶段更新,而在应用请求值和验证阶段很久以前就检查了禁用/必需的属性。

本质上,您应该将复选框值绑定到位于视图范围内的模型中的布尔属性,如下所示:

<h:selectBooleanCheckbox value="#{bean.enabled}" />
<h:inputText required="true" disabled="#{not bean.enabled}" />

或者至少将物理复选框组件本身检查到视图中,如下所示:

<h:selectBooleanCheckbox binding="#{checkbox}" />
<h:inputText required="true" disabled="#{not checkbox.value}" />

当复选框被(取消)选中时,不要忘记提交值和 ajax 更新表单。我也没有在您的尝试中看到这一点。总而言之,这个完整的 copy'n'paste'n'runnable 启动示例应该可以帮助您入门:

<h:form>
    <h:selectBooleanCheckbox binding="#{checkbox}">
        <f:ajax render="@form" />
    </h:selectBooleanCheckbox>

    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />

    <h:commandButton value="submit" />
    <h:messages />
</h:form>

也可以看看:

于 2013-08-28T20:30:17.547 回答