无法使用 jQuery .post() 使数据表工作
Can't make DataTables work by using jQuery .post()
我正在处理一个表单,用户可以在其中选择一个日期范围,以便使用 DataTables 显示信息。
当用户点击按钮时,日期通过 jQuery .post() 函数发送,并按预期检索信息。
下面是与之相关的一段代码:
//Sending the dates range
$.post(url_route, datos, function(data,status){
if(status=='success'){
var response = jQuery.parseJSON(data);
//checking if data were found
if(response.list_events.length === 0){
console.log('No data available');
}
else{
//Let us display the info with DataTables inside div #list_events and
//table #table_id
$('#list_events').html('<table class="table table-striped table-hover" id="table_id"></table>');
$('#list_events table').append('<thead><tr><th>Event</th><th>Type</th><th>Attendance</th><th>Coordinators</th><th>Participants</th><th>Institutes</th><th>Talks</th></tr></thead><tbody></tbody>');
//retrieving the info for each row and append it to the table:
$.each(response.list_events,function(i,item)
{
$('#list_events').find('tbody').append('<tr>');
$('#list_events').find('tbody').append('<td>'+item.Event+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Type+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Attendance+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Coordinator+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Participant+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Institute+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Talk+'</td>');
});//end of each
//initializing DataTables
var table = $('#table_id').DataTable();
}//end of else (info found)
}//end of if success
}//end of post()
到目前为止,数据表中显示了信息,但还不能完全正常工作,因为只显示了信息。 DataTables 搜索、下一个和上一个按钮以及结果数下拉菜单未显示。
在 console.log 中出现以下错误:
Uncaught TypeError: Cannot read property 'length' of undefined
有什么想法吗?任何人都可以阐明这一点吗?
已解决
问题出在追加函数上。
如果我只键入一个仅包含 <tr>
的追加,如下所示:
$('#list_events').find('tbody').append('<tr>');
HTML中的结果是<tr></tr>
也就是说标签自动关闭了……不管怎样。因此,解决方案是将 all 添加到 one 行中,如下所示:
$('#list_events').find('tbody').append('<tr><td>'+item.Event+'</td><td>'+item.Type+'</td><td>'+item.Attendance+'</td><td>'+item.Coordinator+'</td><td>'+item.Participant+'</td><td>'+item.Institute+'</td><td>'+item.Talk+'</td></tr>');
就是这样了☺
我的第一个想法是 "response.list_events" 可能未定义。当然是你的错误:
"Uncaught TypeError: Cannot read property 'length' of undefined"
似乎暗示了这一点。
我的第二个想法是,我最近做了类似的事情,我在使用 .post 方法时遇到了麻烦,并发现使用 .ajax 方法成功了。
尝试以下方法:
$.ajax({
type: "POST",
url: url_route,
data: datos,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(returned_from_server){
// your function here
}
});
我的第三个想法是我没有看到您将结束行标签放在哪里。
$.each(response.list_events,function(i,item)
{
$('#list_events').find('tbody').append('<tr>');
$('#list_events').find('tbody').append('<td>'+item.Event+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Type+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Attendance+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Coordinator+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Participant+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Institute+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Talk+'</td>');
$('#list_events').find('tbody').append('</tr>'); // <--- I believe you might be missing this!!
});//end of each
希望这对您有所帮助。
如果您使用远程数据源,让 DataTables 本身为您呈现数据会更加优雅和高效。
在您的示例中,您获取数据,构建 table,然后将其转换为 "DataTable"。如果它满足要求并完成了工作,那么你已经编写了非常好的代码,你不应该再阅读这个答案!
但 DataTables 本身非常聪明,可以呈现与 DOM 分离的数据,然后将其全部放置到位。您将受益于更高效的更新,同时拥有更简洁的代码。
这是一个基本示例。如果不在您的环境中对其进行测试,我不能肯定它会完成您的工作,但我认为它应该:
var myTable = $('#table_id').DataTable( {
"ajax": {
"url": url_route,
"data": function(customData) {
customData.datos = datos // need some way to have access to datos
}
}
});
然后在单击时,如果您想根据更改的内容(日期范围?)检索更新的数据,您只需重新绘制即可。
myTable.draw();
我可以想像出几种获取数据的方法——将其包装在一个接受和使用数据的函数中。声明一个命名空间或其他准全局变量(如果你是那个人,则实际上是全局变量!) myTable 可以在任何给定时间点访问的变量......或者甚至只是销毁当前 table 并调用再整DataTable()
就可以了。
我正在处理一个表单,用户可以在其中选择一个日期范围,以便使用 DataTables 显示信息。
当用户点击按钮时,日期通过 jQuery .post() 函数发送,并按预期检索信息。
下面是与之相关的一段代码:
//Sending the dates range
$.post(url_route, datos, function(data,status){
if(status=='success'){
var response = jQuery.parseJSON(data);
//checking if data were found
if(response.list_events.length === 0){
console.log('No data available');
}
else{
//Let us display the info with DataTables inside div #list_events and
//table #table_id
$('#list_events').html('<table class="table table-striped table-hover" id="table_id"></table>');
$('#list_events table').append('<thead><tr><th>Event</th><th>Type</th><th>Attendance</th><th>Coordinators</th><th>Participants</th><th>Institutes</th><th>Talks</th></tr></thead><tbody></tbody>');
//retrieving the info for each row and append it to the table:
$.each(response.list_events,function(i,item)
{
$('#list_events').find('tbody').append('<tr>');
$('#list_events').find('tbody').append('<td>'+item.Event+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Type+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Attendance+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Coordinator+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Participant+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Institute+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Talk+'</td>');
});//end of each
//initializing DataTables
var table = $('#table_id').DataTable();
}//end of else (info found)
}//end of if success
}//end of post()
到目前为止,数据表中显示了信息,但还不能完全正常工作,因为只显示了信息。 DataTables 搜索、下一个和上一个按钮以及结果数下拉菜单未显示。
在 console.log 中出现以下错误:
Uncaught TypeError: Cannot read property 'length' of undefined
有什么想法吗?任何人都可以阐明这一点吗?
已解决
问题出在追加函数上。
如果我只键入一个仅包含 <tr>
的追加,如下所示:
$('#list_events').find('tbody').append('<tr>');
HTML中的结果是<tr></tr>
也就是说标签自动关闭了……不管怎样。因此,解决方案是将 all 添加到 one 行中,如下所示:
$('#list_events').find('tbody').append('<tr><td>'+item.Event+'</td><td>'+item.Type+'</td><td>'+item.Attendance+'</td><td>'+item.Coordinator+'</td><td>'+item.Participant+'</td><td>'+item.Institute+'</td><td>'+item.Talk+'</td></tr>');
就是这样了☺
我的第一个想法是 "response.list_events" 可能未定义。当然是你的错误:
"Uncaught TypeError: Cannot read property 'length' of undefined"
似乎暗示了这一点。
我的第二个想法是,我最近做了类似的事情,我在使用 .post 方法时遇到了麻烦,并发现使用 .ajax 方法成功了。
尝试以下方法:
$.ajax({
type: "POST",
url: url_route,
data: datos,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(returned_from_server){
// your function here
}
});
我的第三个想法是我没有看到您将结束行标签放在哪里。
$.each(response.list_events,function(i,item)
{
$('#list_events').find('tbody').append('<tr>');
$('#list_events').find('tbody').append('<td>'+item.Event+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Type+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Attendance+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Coordinator+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Participant+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Institute+'</td>');
$('#list_events').find('tbody').append('<td>'+item.Talk+'</td>');
$('#list_events').find('tbody').append('</tr>'); // <--- I believe you might be missing this!!
});//end of each
希望这对您有所帮助。
如果您使用远程数据源,让 DataTables 本身为您呈现数据会更加优雅和高效。
在您的示例中,您获取数据,构建 table,然后将其转换为 "DataTable"。如果它满足要求并完成了工作,那么你已经编写了非常好的代码,你不应该再阅读这个答案!
但 DataTables 本身非常聪明,可以呈现与 DOM 分离的数据,然后将其全部放置到位。您将受益于更高效的更新,同时拥有更简洁的代码。
这是一个基本示例。如果不在您的环境中对其进行测试,我不能肯定它会完成您的工作,但我认为它应该:
var myTable = $('#table_id').DataTable( {
"ajax": {
"url": url_route,
"data": function(customData) {
customData.datos = datos // need some way to have access to datos
}
}
});
然后在单击时,如果您想根据更改的内容(日期范围?)检索更新的数据,您只需重新绘制即可。
myTable.draw();
我可以想像出几种获取数据的方法——将其包装在一个接受和使用数据的函数中。声明一个命名空间或其他准全局变量(如果你是那个人,则实际上是全局变量!) myTable 可以在任何给定时间点访问的变量......或者甚至只是销毁当前 table 并调用再整DataTable()
就可以了。