【问题标题】:JSF h:column tag not evaluating rendered attributeJSF h:列标签不评估呈现的属性
【发布时间】:2011-06-19 17:20:19
【问题描述】:

我有一个 JSF 数据表,它根据项目的布尔属性有条件地显示每个项目,如下所示:

<h:dataTable value='#{sessionBean.items}' var='item'>
    <h:column rendered='#{item.visible}'>
        <h:outputText value='#{item.description}'/>
    </h:column>
</h:dataTable>

我的问题是 rendered 属性似乎根本没有引用我的项目中的 visible 属性。我已经在属性的 getter 中放置了一条跟踪消息,并且可以确认 getter 根本没有被调用。但是,真正让我感到困惑的是,以下方法有效:

<h:dataTable value='#{sessionBean.items}' var='item'>
    <h:column rendered='true'>
        <h:outputText value='visible = #{item.visible}'/>
        <h:outputText value='#{item.description}'/>
    </h:column>
</h:dataTable>

也就是说,在这种情况下,所有项目都被渲染,并且为每个项目成功输出了文本“visible = true”或“visible = false”。 在列 rendered 属性中 getter 不起作用。

有谁知道可能导致这种行为的原因,以及我应该做些什么来纠正它?

【问题讨论】:

    标签: jsf


    【解决方案1】:

    表格列(阅读:&lt;td&gt; 元素,它们是 same 列中的 all,因此适用于 all 行)逐行呈现。这并不是真正的 JSF 限制,而是更多的 HTML 限制。问问自己,HTML 最终应该是什么样子?浏览器应该如何处理每行缺少的所有&lt;td&gt; 元素?是的,这根本没有意义:)


    只需将基于行的渲染移动到单元格内容:

    <h:column>
        <h:outputText value="#{item.description}" rendered="#{item.visible}"/>
    </h:column>
    

    如果您实际上想要完全隐藏整个列,也可以将其设为基于 bean 的渲染:

    <h:column rendered="#{sessionBean.visible}">
        <h:outputText value="#{item.description}"/>
    </h:column>
    

    【讨论】:

    • 我实际上使用的是大约一年前使用的旧代码库。奇怪的是,当时它似乎工作正常......但我会看看我是否能得到相当于我需要你的方式的东西。干杯!
    • 更新:根据您的建议,我提出了另一种方法。我仍然完全无法解释它以前是如何工作的(你是绝对正确的——它不应该有),除了也许在我不在的情况下事情发生了变化,而且那个特别的小错误毕竟不是我的错- 老实说,我不记得了。再次感谢您的帮助。
    • 我做了一些查找,似乎我不是唯一一个使用 h:column 的 rendered 属性设法获得所需行为的人 - 我发现了 this 之前的帖子今天。现在我真的不知道为什么它以前有效,但现在不行。也就是说,我仍然会改变你的方法 - 这确实有道理。
    猜你喜欢
    • 2012-12-01
    • 2012-10-31
    • 2013-05-16
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多