2013-10-29 44 views
1

在我的桌子我有非常4列:姓名,年龄,百分比,复选框列
http://live.datatables.net/umezez/51/editDataTables - 我应该在哪里更新aData?

我试图做的是基于在最后一栏的复选框来设置百分比列的值。 想法是基于该复选框(这一部分我已经完成)在页脚中总结年龄列,并计算基于该页脚的百分比值。

当我尝试调试并将更新后的数据放到控制台时,我发现百分比值已正确更新,但表未更新。

我的想法是在fnRowCallback更新行,但我认为,当我修改数据fnPreDrawCallback

我使用的数据表1.9.4表应该被更新。
这里是我的代码:

$(document).ready(function() { 

    $(document).on('click', "input.updateFooter", function() { 
     var rowIndex = oTable1.fnGetPosition($(this).closest('tr')[0]); 
     var ok = this.checked ? 1 : 0; 
     oTable1.fnSettings().aoData[rowIndex]._aData.use = ok; 
     oTable1.fnDraw(); 
    }); 

    var iTotal = 0, 
     rowsInUse = 0; 

    var oTable1 = $('#example1').dataTable({ 
     "table-layout": "fixed", 
     "oLanguage": { 
      "sZeroRecords": "No data" 
     }, 
     "fnPreDrawCallback": function (oSettings) { 
      iTotal = 0; 
      rowsInUse = 0; 
      for (var i = 0; i < oSettings.aoData.length; i++) { 
       if (oSettings.aoData[i]._aData.use == 1) { 
        iTotal += oSettings.aoData[i]._aData.age; 
        rowsInUse++; 
       } 
      } 

      for (var j = 0; j < oSettings.aoData.length; j++) { 
       if (oSettings.aoData[j]._aData.use == 1) { 
        oSettings.aoData[j]._aData.percent = (parseInt(oSettings.aoData[j]._aData.age)/iTotal * 100).toFixed(2) + "%"; 
       } else { 
        oSettings.aoData[j]._aData.percent = ""; 
       } 
      } 
      //console.log(oSettings.aoData); 
     }, 
     "fnRowCallback": function (nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
      console.log(aData); 
     }, 
     "fnDrawCallback": function (oSettings) { 
      //oSettings.aoData[0]._aData.percent = "24%"; 
     }, 

     "fnFooterCallback": function (nRow, aaData, iStart, iEnd, aiDisplay) { 
      if (rowsInUse > 0) { 
       $('#sum .c0').html(iTotal); 
       $('#avg .c0').html(rowsInUse > 0 ? (iTotal/rowsInUse).toFixed(2) : 0); 
      } 
     }, 
     "bPaginate": false, 
     "bLengthChange": false, 
     "bFilter": false, 
     "bSort": true, 
     "bInfo": false, 
     "bAutoWidth": false, 
     "aaSorting": [ 
      [0, "asc"] 
     ], 
     "aaData": [{ 
      name: "Tomek", 
      age: 20, 
      percent: "20%", 
      use: 1 
     }, { 
      name: "John", 
      age: 30, 
      percent: "80%", 
      use: 1 
     }], 
     "aoColumns": [{ 
      "sTitle": "Name", 
      "bVisible": true, 
      "sType": "string", 
      "sWidth": "100px", 
      "mData": "name" 
     }, { 
      "sTitle": "Age", 
      "bVisible": true, 
      "sType": "", 
      "sWidth": "50px", 
      "sClass": "center percent", 
      "mData": "age" 
     }, { 
      "sTitle": "%", 
      "bVisible": true, 
      "sType": "", 
      "sWidth": "50px", 
      "sClass": "center percent", 
      "mData": "percent" 
     }, { 
      "sTitle": "", 
      "bVisible": true, 
      "bSortable": false, 
      "sType": "string", 
      "sWidth": "20px", 
      "sClass": "center", 
      "mData": "use", 
      mRender: function (data) { 
       return '<input type="checkbox" class="updateFooter" name="d" ' + (data == 1 ? 'checked="checked"' : '') + ' />'; 
      } 
     }] 
    }); 
}); 

回答

1

你的代码是罚款只是把这个fnRawCallBack

"fnRowCallback": function (nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
    $(nRow).children(':eq(2)').text(aData.percent); 
    return nRow; 
}, 

数据表回收HTML每个平局,解决方法是编辑HTML。链接生活的例子http://live.datatables.net/epulak/

+0

我现在有同样的解决方案:)我一直在想,这将是可能的更新aData和我的表会自动更新DOM(类似绑定)我问DataTables论坛上同样的问题,并得到相同的答案。顺便说一句,你不必返回nRow :) – Misiu

+0

在老版本的数据表中,返回nRow是必需的。感谢那些信息,我不知道现在已经改变了:) –