datatables jquery - Uncaught TypeError : CAnnot read property 'show' of undefined
datatables jquery - Uncaught TypeError : CAnnot read property 'show' of undefined
谁能帮我找出下面代码的问题。
我想做什么:
使用 jquery/datatables,我试图显示特定行的附加数据(使用 ajax 调用检索)。
数据表定义代码为:
$(window).load(function() {
var table = $('#table_id').DataTable({
//"font-size" : 2em,
"columnDefs" : [ {
className : "details-control",
"targets" : [1],
"orderable" : false },
{
"targets" : [2,6],
"width" : "25%",
className : "dt-left"},
{
"targets" : [3,4,5,7],
"width" : "10%",
className : "dt-center"}
]
});
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row( tr );
if ( row.child.isShown() ) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
}
else {
//Open this row
row.child(formatx(row.data())).show();
tr.addClass('shown');
}
});
});
formatx 函数和回调函数是:
function printd(data) {
var pdata = '';
for(var i in data.careGivers){
pdata = pdata + '<tr>'+
'<td>Parent: </td>'+
'<td>'+data.careGivers[i].ParentName+'</td>'+
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">'+pdata+
'</table>';
alert(pdata);
return pdata;
}
function formatx(d) {
var val = d[0];
$.ajax({
url : "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/"+val,
dataType:'json',
success : printd
});
}
我得到的错误(因为没有显示数据,我假设)是:
目前,您的函数 formatx(d)
调用 printd(data)
创建 html
并将其 return 发送到 formatx(d)
但是 formatx(d)
没有 return 任何东西。
您需要将结果 return 返回给 row.child(formatx(row.data())).show();
调用。此外,您的 formatx()
使用 ajax 调用意味着 returned 值不会立即可用,因此您的逻辑必须考虑到这一点。
我至少可以想到 2 种方法(还有更多,可能更好)。
方法一
通过您的函数链传递 row
,然后仅在逻辑末尾调用 row.child(someData).show();
,如下所示:
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
} else {
//Open this row
formatx(row) // just pass row to the format function here
tr.addClass('shown');
}
});
function formatx(row) {
var val = row.data()[0]; //slight change here
$.ajax({
url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
dataType: 'json',
success: function (response) { // change this callback to return the result
return printd(response,row);
}
});
}
function printd(data,row) {
var pdata = '';
for (var i in data.careGivers) {
pdata = pdata + '<tr>' +
'<td>Parent: </td>' +
'<td>' + data.careGivers[i].ParentName + '</td>' +
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
'</table>';
alert(pdata);
row.child(formatx(row.data(pdata))).show();
}
方法二
将所有功能合并到一个块中,让 ajax 成功回调为您处理问题,就像这样(如果您不需要从您的其他地方调用这些功能,这会更简洁一些代码):
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
} else {
var val = row.data()[0];
$.ajax({
url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
dataType: 'json',
success: function (data) {
var pdata = '';
for (var i in data.careGivers) {
pdata = pdata + '<tr>' +
'<td>Parent: </td>' +
'<td>' + data.careGivers[i].ParentName + '</td>' +
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
'</table>';
alert(pdata);
row.child(row.data(pdata)).show();
tr.addClass('shown');
}
});
}
});
谁能帮我找出下面代码的问题。
我想做什么: 使用 jquery/datatables,我试图显示特定行的附加数据(使用 ajax 调用检索)。
数据表定义代码为:
$(window).load(function() {
var table = $('#table_id').DataTable({
//"font-size" : 2em,
"columnDefs" : [ {
className : "details-control",
"targets" : [1],
"orderable" : false },
{
"targets" : [2,6],
"width" : "25%",
className : "dt-left"},
{
"targets" : [3,4,5,7],
"width" : "10%",
className : "dt-center"}
]
});
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row( tr );
if ( row.child.isShown() ) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
}
else {
//Open this row
row.child(formatx(row.data())).show();
tr.addClass('shown');
}
});
});
formatx 函数和回调函数是:
function printd(data) {
var pdata = '';
for(var i in data.careGivers){
pdata = pdata + '<tr>'+
'<td>Parent: </td>'+
'<td>'+data.careGivers[i].ParentName+'</td>'+
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">'+pdata+
'</table>';
alert(pdata);
return pdata;
}
function formatx(d) {
var val = d[0];
$.ajax({
url : "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/"+val,
dataType:'json',
success : printd
});
}
我得到的错误(因为没有显示数据,我假设)是:
目前,您的函数 formatx(d)
调用 printd(data)
创建 html
并将其 return 发送到 formatx(d)
但是 formatx(d)
没有 return 任何东西。
您需要将结果 return 返回给 row.child(formatx(row.data())).show();
调用。此外,您的 formatx()
使用 ajax 调用意味着 returned 值不会立即可用,因此您的逻辑必须考虑到这一点。
我至少可以想到 2 种方法(还有更多,可能更好)。
方法一
通过您的函数链传递 row
,然后仅在逻辑末尾调用 row.child(someData).show();
,如下所示:
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
} else {
//Open this row
formatx(row) // just pass row to the format function here
tr.addClass('shown');
}
});
function formatx(row) {
var val = row.data()[0]; //slight change here
$.ajax({
url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
dataType: 'json',
success: function (response) { // change this callback to return the result
return printd(response,row);
}
});
}
function printd(data,row) {
var pdata = '';
for (var i in data.careGivers) {
pdata = pdata + '<tr>' +
'<td>Parent: </td>' +
'<td>' + data.careGivers[i].ParentName + '</td>' +
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
'</table>';
alert(pdata);
row.child(formatx(row.data(pdata))).show();
}
方法二
将所有功能合并到一个块中,让 ajax 成功回调为您处理问题,就像这样(如果您不需要从您的其他地方调用这些功能,这会更简洁一些代码):
// Add event listener for opening and closing details
$('#table_id').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
//This row is already open - close it
row.child.hide();
tr.removeClass('shown');
} else {
var val = row.data()[0];
$.ajax({
url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
dataType: 'json',
success: function (data) {
var pdata = '';
for (var i in data.careGivers) {
pdata = pdata + '<tr>' +
'<td>Parent: </td>' +
'<td>' + data.careGivers[i].ParentName + '</td>' +
'</tr>';
}
pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
'</table>';
alert(pdata);
row.child(row.data(pdata)).show();
tr.addClass('shown');
}
});
}
});