2.8 KiB
计划:在 addInsertRows 中添加跳转到新增行第一页的功能
需求分析
在 addInsertRows 函数执行后,自动跳转到新增行所在的第一个页面。如果当前页已经是新增行所在的页,则不进行跳转。
代码分析
相关函数位置
-
addInsertRows: feegrid-manager.js:832-843
-
loadPage: feegrid-manager.js:644-743
-
pagination 状态: state.pagination(包含 pageNumber, pageSize, remoteTotal)
数据结构理解
state.cacheManager.getInsertRows()- 获取所有新增行(draftState === 'add')state.pagination.remoteTotal- 远程数据的总条数- 新增行始终位于所有数据的最末端(即 remoteTotal 之后)
分页计算逻辑
-
总数据量 = remoteTotal + insertRows.length
-
新增行的起始位置 = remoteTotal
-
新增行第一行所在的页码 = Math.ceil((remoteTotal + 1) / pageSize)
-
或者:Math.floor(remoteTotal / pageSize) + 1
实现步骤
Step 1: 修改 addInsertRows 函数
在 addInsertRows(rows) 函数末尾添加逻辑:
-
获取所有新增行
insertRows = state.cacheManager.getInsertRows() -
如果
insertRows.length === 0,直接返回(不应该发生,但做防御性检查) -
计算新增行第一行所在的页码:
-
var remoteTotal = state.pagination.remoteTotal -
var pageSize = state.pagination.pageSize -
var firstInsertPage = Math.floor(remoteTotal / pageSize) + 1 -
(或者
Math.ceil((remoteTotal + 1) / pageSize))
-
-
获取当前页码
var currentPage = state.pagination.pageNumber -
如果
firstInsertPage !== currentPage,则调用loadPage(firstInsertPage)跳转
Step 2: 代码放置位置
在 addInsertRows 函数的 for 循环之后(行842之后),在函数结束的大括号之前(行843之前)插入新逻辑。
预期代码变更
function addInsertRows(rows) {
if (!$.isArray(rows)) rows = [rows];
var cm = state.cacheManager;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var key = cm.getRowKey(row);
if (!cm.getRowFromCache(key)) {
cm.setRowToCache(row, true);
}
}
// 新增:跳转到新增行所在的第一页
var insertRows = state.cacheManager.getInsertRows();
if (insertRows.length > 0) {
var remoteTotal = state.pagination.remoteTotal;
var pageSize = state.pagination.pageSize;
var firstInsertPage = Math.floor(remoteTotal / pageSize) + 1;
var currentPage = state.pagination.pageNumber;
if (firstInsertPage !== currentPage) {
loadPage(firstInsertPage);
}
}
}