jQuery DataTables:在initComplete

时间:2017-08-24 07:42:51

标签: javascript ajax datatables

所以,对于我的数据表,我需要做一些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();
            }
        });
     }
 }}});

提前致谢!

1 个答案:

答案 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/