Jsf 2 JSF2.0-h:dataTable的列包含下拉列表-显示/隐藏每个表行的下拉列表的问题

Jsf 2 JSF2.0-h:dataTable的列包含下拉列表-显示/隐藏每个表行的下拉列表的问题,jsf-2,Jsf 2,我有一个表,其中一列包含一个下拉列表(HtmlSelectItems组件)。 对于此表中的任何给定行,我希望能够根据特定的应用程序条件在运行时显示或隐藏下拉列表 在本例中,我的解决方案是使用JSF2.0实现提供的组件的预呈现事件侦听器机制。基本上在JSF页面中,我为HtmlSelectItems组件(位于h:列中)分配了一个id,并使用pre-render f:event元素对其进行设置。 事件指向我的一个方法,它接收组件id并处理它 我的问题是HtmlSelectItems实例在所有表行之间共

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

在本例中,我的解决方案是使用JSF2.0实现提供的组件的预呈现事件侦听器机制。基本上在JSF页面中,我为HtmlSelectItems组件(位于h:列中)分配了一个id,并使用pre-render f:event元素对其进行设置。 事件指向我的一个方法,它接收组件id并处理它

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

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


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

您需要让
呈现的
条件取决于行本身,而不是父bean

例如

如果不是,则维护一个
映射
,其中键实际上是行项目的标识符,该值表示是否应显示下拉列表。然后可按如下方式使用:

public boolean isShowDropdown() {
    Item item = model.getRowData();
    return shouldShowDropdown(item); // Do your thing.
}
<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:selectOneMenu rendered="#{bean.showDropdown[item.id]}">
            ...
        </h:selectOneMenu>
    </h:column>
</h:dataTable>

...

非常感谢您的回答,巴卢斯克。我们将代码更改为使用“rendered”属性。我只是希望我可以内省行的组件并修改它的状态,而不必指定“渲染”。不客气。既然你是新来的,如果一个答案有助于解决问题,请别忘了把它标为接受。另见
public boolean isShowDropdown() {
    Item item = model.getRowData();
    return shouldShowDropdown(item); // Do your thing.
}
<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:selectOneMenu rendered="#{bean.showDropdown[item.id]}">
            ...
        </h:selectOneMenu>
    </h:column>
</h:dataTable>