JSF dataTable的rowClasses属性三元运算符不生效问题
问题分析与解决方案
你的问题出在对JSF h:dataTable的rowClasses属性理解错误——这个属性的作用是循环应用预定义的类名列表(比如rowClasses="odd,even"会让行依次使用odd、even类),并不支持通过EL表达式为每一行动态计算类名,这就是为什么所有行都被设置为OKRowClass(它把整个EL表达式的结果当成了单一的类名循环应用)。
下面是不依赖第三方组件的解决方法:
方法1:使用rowStyleClass属性(推荐)
MyFaces 3.0.2支持JSF规范中的rowStyleClass属性,它可以接受EL表达式,并且会为每一行单独计算表达式结果,完美适配你的动态类需求。
修改内层h:dataTable的代码:
<h:dataTable value="#{item.device.phoneNumber.aliases}" rendered="#{not empty item.device.phoneNumber.aliases}" var="aliasItem" rowStyleClass="#{empty aliasItem.name and not item.editMode ? 'OKRowClass' : 'notOKRowClass'}"> <h:column> <h:inputText value="#{aliasItem.name}"/> </h:column> <!-- 其他列保持不变 --> </h:dataTable>
方法2:自定义行元素(备选)
如果rowStyleClass不符合你的需求,可以通过<f:facet name="row">自定义<tr>标签,直接动态绑定class属性:
<h:dataTable value="#{item.device.phoneNumber.aliases}" rendered="#{not empty item.device.phoneNumber.aliases}" var="aliasItem"> <f:facet name="row"> <tr class="#{empty aliasItem.name and not item.editMode ? 'OKRowClass' : 'notOKRowClass'}"> <td> <h:inputText value="#{aliasItem.name}"/> </td> <td> <!-- 第二列内容 --> </td> </tr> </f:facet> <!-- 需与列数对应空列定义 --> <h:column/> <h:column/> </h:dataTable>
额外排查建议
如果修改后仍然不符合预期,先验证EL表达式的逻辑是否正确:在页面中添加输出标签,查看每一行的计算结果:
<h:outputText value="当前类名:#{empty aliasItem.name and not item.editMode ? 'OKRowClass' : 'notOKRowClass'}"/>
如果输出结果和预期不符,说明是aliasItem.name或item.editMode的值不符合你的判断逻辑,需要检查后端Bean的数据状态。
内容的提问来源于stack exchange,提问作者HockChai Lim
相关产品推荐
相关产品推荐

