
在 kendo ui grid 中,直接使用 `dataitem()` 方法传入 dom 元素(如 `tr[data-uid]`)可能返回 `null`,根本原因在于该方法要求传入的必须是 grid 内部渲染的真实行元素(且需确保 dom 已就绪、数据已绑定),而异步操作中常因时机不当或选择器偏差导致失败;推荐改用 `datasource.getbyuid()` 方法,它不依赖 dom 状态,更可靠、更高效。
Kendo UI 的 grid.dataItem(rowElement) 方法设计初衷是接收由 Grid 渲染生成的
- ✅ 行元素虽存在于 DOM,但尚未被 Grid 完全初始化(例如在 dataBound 事件前调用);
- ❌ 使用 find("tr[data-uid='...']")[0] 获取的 DOM 节点,可能因 Grid 虚拟滚动、分页重绘或模板异步加载而未被 Grid 当前实例识别为有效数据行;
- ⚠️ AJAX 回调中执行该逻辑时,Grid 数据源可能尚未完成同步刷新(如 read() 请求刚返回但 success 事件未触发完毕),此时 DOM 与 DataSource 状态不同步。
因此,最佳实践是绕过 DOM 层级,直接操作数据源(DataSource)。Kendo DataSource 提供了专用于 UID 查找的稳定 API:getByUid(uid)。每个数据项在绑定时会被自动赋予唯一 uid 属性(如 "b318f970-79ec-472e-818f-f0d5adb6b5f3"),该 UID 同时写入
✅ 正确用法示例:
// 假设 Grid 初始化时 ID 为 "myGrid"
var grid = $("#myGrid").data("kendoGrid");
if (!grid) {
console.warn("Grid instance not found");
return;
}
var uidValue = "b318f970-79ec-472e-818f-f0d5adb6b5f3";
var dataItem = grid.dataSource.getByUid(uidValue);
if (dataItem) {
console.log("Found data item:", dataItem);
// 可安全访问字段,如 dataItem.name, dataItem.id 等
} else {
console.warn("No data item found for UID:", uidValue);
}? 注意事项:
- getByUid() 不区分大小写,但需确保传入的 UID 字符串与数据项实际 uid 属性值完全一致(包括连字符和长度);
- 该方法仅在数据项已加载到当前 DataSource(即已触发 read() 并成功响应)后才有效——若在 AJAX 成功回调中调用,请确认 dataSource 已更新(通常 dataBound 事件后保证就绪);
- 若需同时获取对应 DOM 行,可结合 grid.tbody.find("tr[data-uid='" + uidValue + "']"),但切勿反向依赖此 DOM 查找结果调用 dataItem();
- 对于服务器端分页场景,getByUid() 仅对当前页数据有效;如需跨页查找,请先调用 dataSource.fetch() 或 read() 加载目标数据。
总之,在异步上下文(如 AJAX success 回调)中操作 Grid 数据,应始终以 dataSource 为单一可信源,避免 DOM 与数据状态错位引发的 null 陷阱。










