2015-10-04 85 views
3

在我的项目中,我使用Parse.com作为服务器和数据库,并使用DataTable插件创建显示返回数据的表。当我使用预定义的json文件时没有问题,但是当我尝试使用从Parse.com返回的数据构造本地json文件时,出现错误。看起来不管我做什么,表创建过程都是先运行的,只有在创建完json object之后才能运行。相关代码JSfiddle here。请注意,由于大量的代码,我没有提供工作示例,但只有相关的部分。无法使用从Parse.com检索的数据构造DataTable

function getDataFromParse(){ 
    console.log("test function run"); 

     var loc_json={ 
      "data":[] 
     }; 
         //get data from parse 
       var parseTable = Parse.Object.extend("parseTable"); 
       var tableObj = new parseTable(); 
       var query = new Parse.Query(parseTable); 
       var count=0; 

       query.descending("createdAt"); 
       query.find({ 
        success: function(resultArr){ 
           console.log("retreiving data from parse"); 
         for(var i=0;i<resultArr.length;i++){ 
           query.get(resultArr[i].id,{ 
            success: function(tableObj){ 
            var ret_phone = tableObj.get("phone"); 
             var ret_first = tableObj.get("firstName"); 
             var ret_last = tableObj.get("lastName"); 
             var ret_status = tableObj.get("redemption_status"); 
             var ret_vipCode = tableObj.get("vipCode"); 

             loc_json.data.push([count,ret_first +" "+ret_last,ret_phone,tableObj.get("createdAt"),ret_vipCode]); //construction of local json 
             count++; 
             console.log("finished fetching data for "+ret_first+" "+ret_last); 
            }, 
            error: function(object, error) { 
             console.log("could not do something "+error.message); 
            } 
           }); 
         } 
         console.log("success function end"); 
        }, 
        error: function(error){ 
         console.log(error.message); 
        } 
       }); 
    console.log("trying to return json"); 
    return loc_json; 
} 



    var rows_selected = []; 
    console.log("table creation"); 
    var table = $('#example').DataTable({ 
     ajax: getDataFromParse(),  // ajax: 'https://api.myjson.com/bins/4qr1g', THIS WORKS!! 
     columns: [ 
     {}, 
     { data: 1}, 
     { data: 2 }, 
     { data: 3 } 
     ], 
     'columnDefs': [{ 
     'targets': 0, 
     'searchable':false, 
     'orderable':false, 
     'className': 'dt-body-center', 
     'render': function (data, type, full, meta){ 
      return '<input type="checkbox">'; 
     } 
     }], 
     'order': [1, 'asc'], 
     'rowCallback': function(row, data, dataIndex){ 
     // Get row ID 
     $('input.editor-active', row).prop('checked', data[3] == 1) 
     var rowId = data[0]; 

     // If row ID is in the list of selected row IDs 
     if($.inArray(rowId, rows_selected) !== -1){ 
      $(row).find('input[type="checkbox"]').prop('checked', true); 
      $(row).addClass('selected'); 
      console.log("table trying to create itself"); 
     } 
     } 
    }); 
+1

添加jQuery和Parse.com CDN,但得到“未捕获的错误:您需要在使用Parse之前调用Parse.initialize”。我猜测是因为没有“应用程序ID”或“JAVASCRIPT KEY”。也许建立一个虚拟项目并添加一个ID和密钥?还需要有一个带有示例id的表格(http://jsfiddle.net/annoyingmouse/t6xj4wks/2/) – annoyingmouse

+0

感谢您的重播,我创建了一个新的应用程序,其中包含一些示例数据,并更新你的小提琴。它可以在这里找到:http://jsfiddle.net/t6xj4wks/5/ – undroid

回答

1

SOLUTION

  1. 删除从数据表初始化选项ajax选项。

  2. 呼叫getDataFromParse()初始化数据表

  3. success处理程序每​​次查询后,替换此行:

    loc_json.data.push([count, ret_first + " " + ret_last, ret_phone, tableObj.get("createdAt"), ret_vipCode]); 
    

    与线下到一个新行添加到表中。

    $('#example').DataTable() 
        .row.add([ 
         count, 
         ret_first + " " + ret_last, 
         ret_phone, 
         tableObj.get("createdAt"), 
         ret_vipCode 
        ]) 
        .draw(false); 
    

DEMO

this jsFiddle代码和演示。

NOTES

  • 这种解决方案的缺点是新的行会被添加一次,每次查询成功完成。不知道Parse.com是否有可能在所有查询完成时处理事件。

  • 您的示例使用jQuery DataTable 1.9,但您使用的是1.10中的选项名称和API。您需要升级您的jQuery DataTables库。

  • 您正在使用ajax选项向jQuery DataTables提供数据,实际上您应该使用data选项。

  • // FOR TESTING ONLY之后删除代码,因为仅在jQuery DataTables - Row selection using checkboxes文章中需要演示,因此不需要进行生产。
+0

感谢您的详细解答。看起来,表创建功能仍然是首先执行的,并且只有在之后才会填充'loc_json'。控制台首先显示“表创建”消息,然后才执行该行'console.log(“完成获取数据”+ ret_first +“”+ ret_last);'。我错过了什么吗? – undroid

+1

@undroid,你是对的。我错过了有额外的异步'query.get()'的代码,我已经更新了我的解决方案。 –

+0

谢谢!它工作得很好,现在我能够接收数据,但奇怪的是,只有当我点击表格的一个标题时,表格才会显示数据。似乎它会刷新表格以显示数据。 – undroid