Files
workspace/code/jsp/.trae/documents/addInsertRows跳转功能实现计划.md
T
2026-05-12 21:22:17 +08:00

86 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 计划:在 addInsertRows 中添加跳转到新增行第一页的功能
## 需求分析
在 `addInsertRows` 函数执行后,自动跳转到新增行所在的第一个页面。如果当前页已经是新增行所在的页,则不进行跳转。
## 代码分析
### 相关函数位置
* **addInsertRows**: [feegrid-manager.js:832-843](file:///d:/workspace/code/jsp/js/feegrid-manager.js#L832-L843)
* **loadPage**: [feegrid-manager.js:644-743](file:///d:/workspace/code/jsp/js/feegrid-manager.js#L644-L743)
* **pagination 状态**: state.pagination(包含 pageNumber, pageSize, remoteTotal)
### 数据结构理解
1. `state.cacheManager.getInsertRows()` - 获取所有新增行(draftState === 'add')
2. `state.pagination.remoteTotal` - 远程数据的总条数
3. 新增行始终位于所有数据的最末端(即 remoteTotal 之后)
### 分页计算逻辑
* 总数据量 = remoteTotal + insertRows.length
* 新增行的起始位置 = remoteTotal
* 新增行第一行所在的页码 = Math.ceil((remoteTotal + 1) / pageSize)
* 或者:Math.floor(remoteTotal / pageSize) + 1
## 实现步骤
### Step 1: 修改 addInsertRows 函数
在 `addInsertRows(rows)` 函数末尾添加逻辑:
1. 获取所有新增行 `insertRows = state.cacheManager.getInsertRows()`
2. 如果 `insertRows.length === 0`,直接返回(不应该发生,但做防御性检查)
3. 计算新增行第一行所在的页码:
* `var remoteTotal = state.pagination.remoteTotal`
* `var pageSize = state.pagination.pageSize`
* `var firstInsertPage = Math.floor(remoteTotal / pageSize) + 1`
* (或者 `Math.ceil((remoteTotal + 1) / pageSize)`)
4. 获取当前页码 `var currentPage = state.pagination.pageNumber`
5. 如果 `firstInsertPage !== currentPage`,则调用 `loadPage(firstInsertPage)` 跳转
### Step 2: 代码放置位置
在 `addInsertRows` 函数的 for 循环之后(行842之后),在函数结束的大括号之前(行843之前)插入新逻辑。
## 预期代码变更
```javascript
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);
}
}
}
```