所以,对于我的数据表,我需要做一些ajax调用并使用返回的信息重绘表,但我有一些......问题。
我尝试在Datatable事件中执行ajax调用" drawCallback",并在调用完成时调用函数 draw (),但是,在执行时,事件是无休止地触发,直到浏览器崩溃。我想这是因为事件" drawCallback"在调用 draw()之后被激活(现在对我来说这似乎很明显,但在编写代码时我没有意识到这一点。)
所以,我的问题是,如果我尝试在事件内执行相同的ajax调用(和后验 draw()调用)" initComplete"而不是使用&# 34; drawCallback", draw()函数将触发事件" initComplete"再次? (并导致无限循环)
编辑:我忘了提到我使用Java Servlet作为服务器,其中ajax调用是定向的。这是Datatable代码:
(是的,我在这里使用scriptlet,我是一个怪物)
$("#dtExample").DataTable({
data: <%= lGastosJson %>,
columns: [
{data: 'idGasto'},
{data: 'fecha'},
{data: 'descripcion'},
{data: 'projectDescription'},
{data: 'descrTipoGasto'},
{data: 'costoTotalEuro'},
{data: 'nombreAdjunto',
defaultContent: ''}
],
columnDefs: [
// ...
],
drawCallback: function(settings){
var tableData = this.api().rows().data();
var redraw = false;
var self = this;
for (var i=0;i<tableData.length;i++){
//This column may be empty, I'm only doing the ajax call if it is NOT empty
if (typeof tableData[i]['nombreAdjunto'] !== 'undefined'){
var output = "";
$.ajax({
url: '<%= contextPath %>/AsincronasServlet',
data: {command: "getAttachPhotos", username: "<%= user %>", adjunto: tableData[i]['nombreAdjunto'], index: i},
success: function(result){
console.log(result);
var resultParams = result.split("@");
var error = false;
var index = -1;
for (var j=0; j<resultParams.length; j++){
if (resultParams[j].substring(0,5) === "error"){
error = true;
}
if (resultParams[j].substring(0,5) === "index"){ //el indice se necesita tanto en success como en error
var idxPar = resultParams[j].split(":");
index = idxPar[1];
}
}
//The idea is using this if-else to change the inner HTML of the column and then redraw
if (error){
output = "<span class='fa fa-search fa-2x previewError' aria-hidden='true' title='Error al cargar la imagen'></span>";
tableData[index]['nombreAdjunto'] = output;
} else {
//haven't coded this yet
}
self.api().rows().draw();
}
});
}
}}});
提前致谢!
答案 0 :(得分:0)
我建议你先进行操作,而不是在表初始化之后。您可以将函数传递给数据,并在该函数中运行AJAX循环。非常原理图,我无法重现您的代码:
function dataCallback(tableData) {
for (var i=0;i<tableData.length;i++){
...
...
if (i == tableData.length-1) {
return tableData
}
}
}
在dataTable初始化中:
data: dataCallback(<%= lGastosJson %>),
概念证明,数据可以通过这种方式进行操作 - &gt;的 http://jsfiddle.net/0f9Ljfjr/960/ 强>