【问题标题】:JSF2.0 - h:dataTable with column containing dropdown - issue with showing/hiding the dropdown per table rowJSF2.0 - h:dataTable 的列包含下拉列表 - 显示/隐藏每个表行的下拉列表的问题
【发布时间】:2011-09-09 16:03:36
【问题描述】:

我有一个表格,其中一个列包含一个下拉列表(HtmlSelectItems 组件)。 对于此表中的任何给定行,我希望能够根据特定的应用程序条件在运行时显示或隐藏下拉列表。

我在这种情况下的解决方案是使用 JSF2.0 实现提供的组件的预渲染事件监听器机制。基本上在 JSF 页面中,我为 HtmlSelectItems 组件(位于 h:column 中)分配了一个 id,并使用预渲染 f:event 元素对其进行了设置。 f:event 指向我的一种方法,该方法接收组件 ID 并对其进行处理。

我的问题是 HtmlSelectItems 实例在所有表行之间共享,如果说我在一个下拉列表组件上调用 HtmlSelectItems.setRender(false),则所有后续行都将停止显示下拉列表。事实上,一旦在下拉列表中调用第一个 setRender(false),f:event 预渲染监听器就会停止调用

我可以理解在表格行之间共享一个 HtmlSelectItems 实例这一事实 对整体性能有积极影响,但不应该在每一行重新初始化这个组件实例吗?

非常感谢您在这方面的任何澄清。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    您需要让 rendered 条件依赖于行本身,而不是父 bean。

    例如

    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:selectOneMenu rendered="#{item.showDropdown}">
                ...
            </h:selectOneMenu>
        </h:column>
    </h:dataTable>
    

    而不是

    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:selectOneMenu rendered="#{bean.showDropdown}">
                ...
            </h:selectOneMenu>
        </h:column>
    </h:dataTable>
    

    或者如果由于某些设计限制需要由#{bean}而不是#{item}来确定,那么有几种方法。

    如果你使用DataModel作为数据表的value,那么你可以得到当前行如下:

    public boolean isShowDropdown() {
        Item item = model.getRowData();
        return shouldShowDropdown(item); // Do your thing.
    }
    

    如果不是,则维护一个Map&lt;Long, Boolean&gt;,而不是其中键实际上是行项的标识符,值表示是否应显示下拉菜单。然后可以按如下方式使用:

    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:selectOneMenu rendered="#{bean.showDropdown[item.id]}">
                ...
            </h:selectOneMenu>
        </h:column>
    </h:dataTable>
    

    【讨论】:

    • 非常感谢 BalusC 的回答。我们更改了代码以使用“rendered”属性。我只是希望我可以自省“行”组件并修改它的状态,而不必指定“渲染”。
    • 不客气。由于您是新来的,如果答案有助于解决问题,请不要忘记将其标记为已接受。另请参阅meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2023-04-08
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多