如何在验证阶段隐藏JSF组件

时间:2013-12-07 12:37:11

标签: jsf primefaces

我有3个列表框:第一个包含类型,第二个包含所选类型的子类型,第三个包含所选类型和子类型的元素。

<p:selectonelistbox id = "types" rendered = "true" valuechangelistener = "#{bean.selectType}" onchange = "submit()" />
<p:selectonelistbox id = "subtypes" rendered = "#{bean.subtypesFlag}" valuechangelistener = "#{bean.selectSubType}" onchange = "submit()" />
<p:selectonelistbox id = "elements" rendered = "#{bean.elementsFlag}" />


@viewscoped
...
private Boolean subtypesFlag = false;
private Boolean elementsFlag = false;
public void selectType(ValueChangeEvent  event) {
  subtypesFlag = true;
  elementsFlag = false;
}
public void selectSubType(ValueChangeEvent  event) {
  elementsFlag = true;
}

始终显示第一个列表框,仅在选择某个类型时显示第二个列表框,仅在选择子类型时显示第三个列表框。

当我打开视图时,只渲染类型。然后我按某种类型,亚型变得可见。接下来我按下一些子类型,元素变得可见。一切都很好。

但是当我选择其他类型时,我想只显示子类型,但没有元素列表框。我有一个问题。当我真正选择其他类型时,我可以看到所有三个列表框。当我再次按下另一种类型时,我只看到类型和子类型,没有元素列表框。

这似乎是一个有趣的事实,当在应用请求值阶段时,您的组件将标志设置为 false 并且它变为 true 验证阶段期间(当调用值动作侦听器时),它会更改其渲染状态并在渲染响应阶段上呈现IS。但是当应用请求值阶段上的渲染标志为 true 时,验证阶段上的 false 它没有'看到变化并且仍然在渲染响应阶段上呈现。

我可以在验证阶段以某种方式将其状态更改为false(以编程方式使其渲染标志无效或无效)?

Mojarra 2.2.4,Primefaces 4,Glassfish 4。

1 个答案:

答案 0 :(得分:5)

valueChangeListener是在调用应用程序阶段执行方法的具体功能要求的错误工具(正如您明确表示的那样)。它确实在验证阶段执行(如您所发现的)。您需要<f:ajax listener>。当你实际使用JSF 2.x时,也许你过分关注JSF 1.x风格的例子。

相应修复:

<p:selectOneListbox id="types">
    <p:ajax listener="#{bean.selectType}" update="@form" />
</p:selectOneListbox>
<p:selectOneListbox id="subtypes" rendered="#{bean.subtypesFlag}">
    <p:ajax listener="#{bean.selectSubType}" update="@form" />
</p:selectOneListbox>
<p:selectOneListbox id="elements" rendered="#{bean.elementsFlag}" />

不要忘记从方法中删除ValueChangeEvent参数。

另见:

相关问题