2

我有一个在 IceFaces 1.8.x (JSF 1.2) 中开发的弹出对话框。

该对话框是可重复使用的(用于创建和修改帐户)并有一个取消按钮immediate = true(以避免验证)。此对话框过去曾遇到过问题,在重新打开对话框时会呈现旧值,但现在已按照此处的指示修复了该问题(通过设置submittedValue为 null 等)。

我现在面临的问题是特定于有条件禁用的输入字段 ( <ice:inputText>),这就是发生的情况:

  1. 弹出窗口首先打开(例如用于创建帐户)并且此字段未被禁用。
  2. 用户然后取消此对话框,并且由于我们已经合并了上面提到的修复 ( setSubmittedValue(null)),因此submittedValue该字段的 设置为 null(以及其他字段)。
  3. 现在用户打开“修改帐户”对话框,在此字段中被禁用。在用户对表单进行任何更改之前,一切似乎都很好。
  4. 当用户更改表单中的某些字段(例如名称)时,会按预期对名称字段进行部分提交,但同时为该禁用字段提交空值。

可以通过在相关字段的 setter 方法中添加空检查来解决此问题,但这不是项目所需的解决方案 - 因为有多个地方可能需要这样做,而且看起来不是一个非常直观的事情。

所以我需要明白:

  1. 为什么首先调用此禁用字段的设置器?这也是一个空值。不会为任何其他启用的字段调用 setter。
  2. 更重要的是,有没有办法解决这个问题(除了在 setter 中添加空检查)?
4

1 回答 1

2

您必须使用rendered属性来显示/隐藏对话框

<ice:panelPopup modal="true" rendered="#{bean.enabled}">

当对话框重新打开时,它会从前一个实例中得到一些剩余值

解决方案(或解决方法)是使用<c:if>而不是rendered属性,这样当对话框关闭时 DOM 将被完全破坏,并在对话框打开时从头开始创建

<c:if test="#{bean.enabled}">
    <ice:panelPopup modal="true">
    ...
    </ice:panelPopup>
</c:if>

这样,您甚至不需要将修复设置submittedValue为 null

于 2015-01-02T08:01:10.077 回答