【问题标题】:How to hide a JSF component on a Validate phase如何在验证阶段隐藏 JSF 组件
【发布时间】:2013-12-07 12:37:11
【问题描述】:

我有 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验证阶段(当调用值操作侦听器时)它会更改其呈现状态并在呈现响应阶段呈现。但是,当它的渲染标志在 apply request values 阶段true 并在 validate 阶段 达到 false 时,它不会'看不到变化,仍然在渲染响应阶段渲染。

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

Mojarra 2.2.4、Primefaces 4、Glassfish 4。

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    valueChangeListener 是在调用应用程序阶段执行方法的具体功能要求的错误工具(正如您明确的意图)。它确实在验证阶段执行(如您所见)。你需要&lt;f:ajax listener&gt;。也许您在实际使用 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 参数。

    另见:

    【讨论】:

    • 删除了我的答案,因为你的答案是正确的。照常。继续努力。
    • @Andre:如果你想和我一样优秀,尝试在你的沙盒环境中重现 OP 的问题,真正在本地解决问题并在发布答案之前测试代码。你也会真正学到一些东西并变得非常好。我 10 年前做过。
    • 实际上,我通常会这样做。这是一个简单的,我想我可以摆脱懒惰。我的错。此外,如果我要先尝试,你会比我更胜一筹……哈哈。另一方面,用面板包装组件并仅更新这些组件而不是更新整个表单是否有意义?
    • @Andre:确实也希望这样做,但是 OP 当前的方法已经更新了整个页面,因此更新表单不会造成伤害。由 OP 进一步调整。
    • BalusC,我希望你能回答,它已经发生了:)它现在工作完美!我真的很害怕ajax,但也许这种情况会让我更简单:)
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多