从接口获取JSON数据传入DataTables报错,请求排查故障
解决DataTables通过Ajax接口加载数据时的"Cannot read property 'row' of undefined"报错
我来帮你排查这个问题,看你的代码和报错信息,主要是几个配置冲突和回调时机的问题导致的:
问题分析
- DataTables配置冲突:你同时设置了
"data": data和"ajax": function(...)选项,这两个选项是互斥的——DataTables要么通过ajax异步加载数据,要么通过data直接传入本地数据集,同时使用会导致内部逻辑混乱,引发报错。 - Ajax回调时机错误:你在
always回调里初始化表格,always会在请求成功或失败时都执行。如果请求失败,这里的data参数并不是你需要的JSON数据,而是jQuery的jqXHR对象,用错误的数据初始化表格自然会出问题。 - 自定义Ajax函数用法错误:你写的
ajax回调函数没有遵循DataTables的要求——它应该负责发起请求并将正确的数据集传递给callback,而不是直接把外部的data传进去。
解决方案
根据你的需求,这里提供两种可行的修正方案:
方案1:直接使用DataTables内置的Ajax加载(推荐)
如果你的接口返回数据格式和本地txt文件一致,直接让DataTables自己处理Ajax请求即可,不用手动写jQuery Ajax:
var table = $('#feeds').DataTable({ "ajax": "../forms/test/get_data", "scrollX": true, "columns": [ { "className": 'details-control', "orderable": false, "data": null, "defaultContent": '' }, { "data": "id" }, { "data": "status" } ] });
方案2:手动处理Ajax后用data选项初始化表格
如果你需要自定义Ajax的逻辑,就在done回调里(确保请求成功)用获取到的数据初始化表格,不要用ajax选项:
var table; $.ajax({ url: '../forms/test/get_data', type: 'GET', dataType: 'json' }) .done(function(data) { console.log("success", data); // 仅在请求成功时初始化表格 table = $('#feeds').DataTable({ "scrollX": true, "data": data, "columns": [ { "className": 'details-control', "orderable": false, "data": null, "defaultContent": '' }, { "data": "id" }, { "data": "status" } ] }); }) .fail(function() { console.log("error"); }) .always(function() { console.log("request completed"); });
为什么会出现那个报错?
当你用错误的数据(比如请求失败时的jqXHR对象)或者同时启用data和ajax选项时,DataTables无法正确解析数据集,导致表格初始化不完整,createdRow钩子函数在执行时找不到预期的row对象,从而抛出Cannot read property 'row' of undefined的错误。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

