使用sap.ui.table.Table时,带visibleRowCount如何通过getRows获取全量行信息
解决sap.ui.table.Table虚拟滚动下获取全量数据并设置CSS的问题
我明白你遇到的困境——设置visibleRowCount="10"后表格实现了虚拟滚动(只渲染可见行),但getRows()只能拿到当前渲染的10行,没法一次性给全量符合条件的行加样式,同时还得保持表头固定。下面给你几个可行的方案:
核心问题分析
sap.ui.table.Table在开启虚拟滚动时(通过visibleRowCount或相关配置触发),只会渲染当前视口内的行,未滚动到的行不会生成DOM元素,所以getRows()只能返回已渲染的行实例。直接循环全量数据索引去取行必然会报错,因为大部分索引对应的行还没被创建。
方案1:利用updateFinished事件 + 绑定上下文匹配(推荐)
这个方案不需要直接操作DOM,完全基于UI5控件API,可靠性更高:
- 移除你当前的
onAfterRendering重写逻辑,改为监听表格的updateFinished事件——这个事件会在**每次数据绑定更新(包括滚动加载新行)**后触发,刚好可以处理新渲染出来的行。 - 在事件回调中,获取当前所有已渲染的行,通过行的绑定上下文拿到对应的数据,判断是否需要添加样式。
修改后的代码示例:
var table = this.getView().byId("uiTable"); // 监听表格数据更新完成事件 table.attachUpdateFinished(function(oEvent) { // 获取当前已渲染的所有行 var aRenderedRows = this.getRows(); aRenderedRows.forEach(function(oRow) { // 获取行对应的绑定上下文(关联tableModel的数据) var oRowContext = oRow.getBindingContext("tableModel"); if (oRowContext) { var sRegion = oRowContext.getProperty("Region"); if (sRegion === "AP") { // 给整行添加样式类(推荐) oRow.addStyleClass("mystyle-row"); // 如果需要给特定列的单元格加样式,比如State列(对应索引1) var oTargetCell = oRow.getCells()[1]; oTargetCell.addStyleClass("mystyle-cell"); } } }); });
对应的CSS可以这样写:
.mystyle-row { background-color: #f0f8ff; } .mystyle-cell { color: #1a73e8; font-weight: bold; }
方案2:通过行模板绑定动态样式类(更优雅)
如果你的样式逻辑只和数据相关,还可以直接在XML模板中绑定styleClass,完全不需要JS操作:
修改列的模板(以Region列为例):
<Column width="5rem"> <m:Label text="Region"/> <template> <m:Text text="{tableModel>Region}" wrapping="false" styleClass="{= ${tableModel>Region} === 'AP' ? 'mystyle-cell' : '' }" /> </template> </Column>
如果要给整行加样式,可以给表格的rowSettingsTemplate绑定样式:
<Table id="uiTable" selectionMode="None" rows="{tableModel>/Sheet1}" visibleRowCount="10"> <!-- 添加行设置模板 --> <rowSettingsTemplate> <m:RowSettings styleClass="{= ${tableModel>Region} === 'AP' ? 'mystyle-row' : '' }" /> </rowSettingsTemplate> <!-- 原有列定义 --> <columns> <!-- ... 你的列代码 ... --> </columns> </Table>
这个方案更符合UI5的MVVM设计思想,样式逻辑和数据绑定直接关联,不需要手动监听事件。
关键注意事项
- 避免直接操作DOM(比如
$("#id")):UI5控件的DOM ID可能会在重渲染时变化,而且虚拟滚动会不断销毁/创建DOM元素,直接操作DOM的样式很容易失效。 visibleRowCount是保持表头固定的关键:不要移除它,虚拟滚动和固定表头是绑定的,这个属性能让表格容器产生滚动条,表头固定在顶部。
内容的提问来源于stack exchange,提问作者user2644620
相关产品推荐
相关产品推荐

