You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:35:16