2013-05-25 27 views
5

Tam olarak ne istediğimi öğrenmek için yakınım, sadece biraz yardıma ihtiyacım var.jquery datatables - Bir gruptaki toplam sütunlar

Grup çalışıyorum. Şimdi her grup için sütunları toplamak ve toplamı grup başlığında görüntülemek istiyorum. daha kolay ben yapmaya çalışıyorum göstermek için yana İşte bunun bir jsfiddle var:

http://jsfiddle.net/RgKPZ/123/

ilgili kodu:

$(function() { 
      oTable = $('#job_history').dataTable({ 

       "aoColumnDefs": [ 
        { "bVisible": false, "aTargets": [ 4,5,6 ] }, 
       ], 
       "aLengthMenu": [[10, 25, 50, -1], ["Show 10 entries", "Show 25 entries", "Show 50 entries", "Show all entries"]], // options in the show rows selector 
       "iDisplayLength" : -1, // show all rows by default 
       "aaSortingFixed": [[ 5, 'asc' ]], 
       "aaSorting": [[ 5, 'asc' ]], 
       "bJQueryUI": true, 
       "sDom": '<flip>', // filter, length, info, pagination 

       "oLanguage": { 
        "sSearch": "", // label for search field - see function below for setting placeholder text 
        "sLengthMenu": "_MENU_", // label for show selector { "sLengthMenu": "Display _MENU_ jobs" } 
        "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries.", // string for information display 
        "sInfoEmpty": "No entries to show", // what to show when info is empty 
        "sInfoFiltered": " (Filtering from _MAX_ entries.)", 
        "sEmptyTable": "There are no entries matching the search criteria.", // shown when table is empty, regardless of filtering 
        "sZeroRecords": "", // shown when nothing is left after filtering 
       }, 

       "fnDrawCallback": function (oSettings) { 
        if (oSettings.aiDisplay.length == 0) 
        { 
         return; 
        } 

        var nTrs = $('#job_history tbody tr'); // get all table rows 
        var iColspan = nTrs[0].getElementsByTagName('td').length; 
        var sLastGroup = ""; 
        var summed_minutes = 0; 

        for (var i = 0; i < nTrs.length; i++) 
        { 
         var iDisplayIndex = oSettings._iDisplayStart + i; 
         var sGroup = oSettings.aoData[ oSettings.aiDisplay[iDisplayIndex] ]._aData[ 5 ]; 

         if (sGroup != sLastGroup) 
         { 
          var nGroup = document.createElement('tr'); 
          var nCell = document.createElement('td'); 
          nCell.colSpan = iColspan; 
          nCell.className = "group"; 

          summed_minutes += oSettings.aoData[ oSettings.aiDisplay[iDisplayIndex] ]._aData[ 7 ]; 
          nCell.innerHTML = sGroup + summed_minutes; 
          nGroup.appendChild(nCell); 
          nTrs[i].parentNode.insertBefore(nGroup, nTrs[i]); 
          sLastGroup = sGroup; 
         } 
        } 
       } 

      }); 

     }); 

tek sorun özetlemek istiyorum sütunları olmadığına karar olduğunu birlikte ekleniyor. Değerler görüntüleniyor, ancak benzer sayıları bir araya getirmek yerine bir dizgi gibi. Ayrıca, tüm değerler bir dizi olarak gösterilmiyor bile - tekrarlar oluyor. Number() ve parseInt() kullanarak dönüştürme denedim ama şans yok. Bunu, her bir filtre filtresinden sonra toplanacak olan geri arama işlevine (gruplama işlevi gibi) koymaya çalışıyorum.

Eminim ki bir değişkenin yanlış ya da yanlış yere ya da başka bir şeye sahip olduğuna eminim, ama bunu çözemiyorum. Hayal kırıklığına yakın! id benzersiz olmalıdır, çünkü :-(

TIA, Matt

+0

Hangi sütun için toplam istiyorum ve gruplar nelerdir? –

+0

5. sütunlarda tüm hücreleri eklemek için bunu kullanın '$ (" table tr td: nth-child (4) "), her (function {) { total + = parseFloat ($ (this) .text()); }); ' –

+0

Yardım için teşekkürler. Ben daha yakınım ama hala tam orada değil. Şimdi nerede olduğumu göstermek için jsfiddle'ımı güncelledim. http://jsfiddle.net/RgKPZ/126/ – Matt

cevap

6

tüm <div id='group_sum'>0</div><div class='group_sum'></div> için

Değişim ... Bu deneyin. öylesine kullanmak sınıf

fiddle

$(function() { 
    var oTable = $('#job_history').dataTable({ 
     "aoColumnDefs": [{ "bVisible": false, "aTargets": [4, 5, 6]}], 
     "aLengthMenu": [[10, 25, 50, -1], ["Show 10 entries", "Show 25 entries", "Show 50 entries", "Show all entries"]], 
     "iDisplayLength": -1, 
     "aaSortingFixed": [[5, 'asc']], 
     "aaSorting": [[5, 'asc']], 
     "bJQueryUI": true, 
     "sDom": '<flip>', 
     "fnDrawCallback": function(oSettings) { 
      if (oSettings.aiDisplay.length == 0) { 
       return; 
      } 

      // GROUP ROWS 
      var nTrs = $('#job_history tbody tr'); 
      var iColspan = nTrs[0].getElementsByTagName('td').length; 
      var sLastGroup = ""; 

      for (var i = 0; i < nTrs.length; i++) { 
       var iDisplayIndex = oSettings._iDisplayStart + i; 
       var sGroup = oSettings.aoData[oSettings.aiDisplay[iDisplayIndex]]._aData[5]; 

       if (sGroup != sLastGroup) { 
        var nGroup = document.createElement('tr'); 
        var nCell = document.createElement('td'); 
        nCell.colSpan = iColspan; 
        nCell.className = "group"; 
        nCell.innerHTML = sGroup; 
        nGroup.appendChild(nCell); 
        nTrs[i].parentNode.insertBefore(nGroup, nTrs[i]); 
        sLastGroup = sGroup; 
       } 
      } 
      //------------------------------------------------- 
      // SUM COLUMNS WITHIN GROUPS 
      var total = 0; 
      $("#job_history tbody tr").each(function(index) { 
       if ($(this).find('td:first.group').html()) { 
        total = 0; 
       } else { 
        total = parseFloat(total) + parseFloat(this.cells[4].innerHTML); 
        $(this).closest('tr').prevAll('tr:has(td.group):first').find("div").html(total); 
       } 
      }); 
      //------------------------------------------------- 
     } 
    }); 
}); 
Çalışırken görün
+0

OMG. Çok teşekkür ederim! İşimi nasıl değiştirdiğini görerek çok şey öğrendim. Seninki benimkinden daha basit/daha zarif görünüyor, muhtemelen bu yüzden gerçekten işe yarıyor. :-) Ve sınıftaki şeyle ilgili id ​​için bana duh. Tekrar teşekkür ederim! Haftanı yaptın! – Matt

İlgili konular