如何在DatatableAdvanced.init()后访问ajaxTable?row方法报错解决
解决DatatableAdvanced无法访问DataTable实例的问题
看起来你遇到的核心问题是:你试图直接调用DatatableAdvanced.row(tr),但row是DataTable实例的方法,而不是你自定义的DatatableAdvanced模块对象的方法——你的模块目前只负责初始化表格,没有把DataTable实例暴露给外部访问。
下面是具体的修复方案:
1. 修改模块,保存并暴露DataTable实例
首先需要在你的DatatableAdvanced模块内部保存初始化后的DataTable实例,并提供一个获取实例的方法,这样外部就能调用DataTable的API了:
// Setup module var DatatableAdvanced = function() { // 声明变量保存DataTable实例 var dtInstance; // Basic Datatable examples var _componentDatatableAdvanced = function() { // Ajax DataTable var ajaxTable = $('.datatable-ajax'); var table = ajaxTable.data("table"); var search = ajaxTable.data("search"); // 初始化表格并将实例存入变量 dtInstance = ajaxTable.DataTable({ autoWidth: false, dom: '<"datatable-header"Bip><"datatable-scroll-wrap"rt><"datatable-footer"ip>', processing: true, serverSide: true, ordering: true, ajax: table + ".php?action=ajaxTable&" + search, }); }; // 新增方法,供外部获取DataTable实例 var _getTableInstance = function() { return dtInstance; }; return { init: function() { _componentDatatableAdvanced(); }, getTableInstance: _getTableInstance } }();
2. 在点击事件中获取实例并调用API
接下来修改你的初始化代码,通过模块提供的方法获取DataTable实例,之后再调用row方法:
// Initialize modules document.addEventListener('DOMContentLoaded', function() { DatatableAdvanced.init(); // Ajax inline view $('.table.ajax-view').on( "click", ".ajax-view-info", function(e) { e.preventDefault(); var tr = $(this).closest('tr'); // 获取DataTable实例 var dtInstance = DatatableAdvanced.getTableInstance(); var row = dtInstance.row( tr ); if ( row.child.isShown() ) { // 关闭已展开的子行 row.child.hide(); tr.removeClass('shown'); } else { // 展开子行(确保format函数已定义) row.child( format(row.data()) ).show(); tr.addClass('shown'); } }); });
额外说明
如果你需要在点击按钮时更新表格数据(比如重新从服务器拉取最新数据),可以调用DataTable实例的ajax.reload()方法:
// 在点击事件中需要更新的位置添加 dtInstance.ajax.reload();
内容的提问来源于stack exchange,提问作者Fadi Barakat
相关产品推荐
相关产品推荐

