Вы должны позволить условию rendered
зависеть от самой строки, а не от родительского компонента.
Например,
<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<Long, Boolean>
вместо этого, где ключ фактически является идентификатором элемента строки, а значение представляет, должен ли быть показан раскрывающийся список.Это может быть использовано следующим образом:
<h:dataTable value="#{bean.list}" var="item">
<h:column>
<h:selectOneMenu rendered="#{bean.showDropdown[item.id]}">
...
</h:selectOneMenu>
</h:column>
</h:dataTable>