2015-01-13 3 views
7

각 열의 합계 값을 클래스 "sum"과 함께 작은 꼬리말로 삽입하는 데 문제가 있습니다.DataTables.net 테이블 열 합계 바닥 글

코드 (더 많거나 적은 DataTables.net에서 직접 찍은) 이동 :

var table = $('#example').DataTable(); 
 
     table.columns('.sum').each(function (el) { 
 
      var sum = table 
 
       .column(el) 
 
       .data() 
 
       .reduce(function (a, b) { 
 
        return parseInt(a, 10) + parseInt(b, 10); 
 
       }); 
 
      $(el).html('Sum: ' + sum); 
 
     });

"합"정확한 값을 가지고 있지만 어떻게 든 바닥 글 삽입되지 않습니다! 나는. 그것의 -element는 비어 있습니다.

아래 스 니펫은 정상적으로 작동하지만 각 열을 클래스 합계로 합산하려고합니다.

var table = $('#example').DataTable(); 
 
var column = table.column(4); 
 

 
$(column.footer()).html(
 
    column.data().reduce(function (a, b) { 
 
     return parseInt(a, 10) + parseInt(b, 10); 
 
    }) 
 
);

///////////////////////////////////// ///////////////////////////////

EDIT - 해결 방법 :

코드를 DataTable이 초기화 된 위치로 이동하고 대신 footerCallback을 사용하여 이동했습니다. 코드 아래 참조 :

"footerCallback": function (row, data, start, end, display) { 
 
        var api = this.api(), data; 
 
        
 
        // Remove the formatting to get integer data for summation 
 
        var intVal = function (i) { 
 
         return typeof i === 'string' ? 
 
          i.replace(/[\$,]/g, '') * 1 : 
 
          typeof i === 'number' ? 
 
          i : 0; 
 
        }; 
 

 
        // Total over this page 
 
        pageTotal = api 
 
         .column('.sum', { page: 'current' }) 
 
         .data() 
 
         .reduce(function (a, b) { 
 
          return intVal(a) + intVal(b); 
 
         }, 0); 
 

 
        // Update footer 
 
        $(api.column('.sum').footer()).html(pageTotal); 
 
       }

는 어떻게 든 지금 값이 바로 TFOOT 요소에 삽입됩니다. 아직도 그것이 어째서 작동하지 않을지 전혀 모르겠다. (그러나 JS 파일을 포함하는 주석 순서에 언급 된 것과 같이 그것의 일부와 관련이있을 수있다).

지금 난 그냥

+0

js 바이올린을 만들고 우리와 공유하십시오. –

+0

다음과 같은 것이 있습니다 : http://jsfiddle.net/d49c8jLL/ – skepnaden

+0

관련성이 있거나 그렇지 않을 수 있습니다. JQuery를 사용하여 DataTables 부트 스트랩 js를 잘못된 순서로로드하는 것으로 보입니다. (유사한 js 오류에 따라 : http://stackoverflow.com/questions/26165263/datatables-uncaught-typeerror-cannot-read-property-defaults-of-undefined). 나는 그것들을 바꿨고 이제 스타일은 진행을 나타 내기 위해 조금 바뀌었지만 어떤 열에서도 tfoot 요소의 합계 값은 여전히 ​​남아 있지 않습니다. – skepnaden

답변

7

테이블 조작 코드가 DataTable을 초기화하는 경우에만 실행해야 (initComplete 속성을 참조하십시오) 방법 클래스 = "합계"와 루프 여러 열을 ...에 파악해야한다.

<tfoot></tfoot> 블록을 <table>에 정의했는지 확인하십시오. 그렇지 않으면 바닥 글이 없습니다.

그렇지 않으면 당신이 솔루션을하는 듯, 수정 된 코드 아래 참조하십시오

var table = $('#ticketTable').DataTable({ 
    'initComplete': function (settings, json){ 
     this.api().columns('.sum').every(function(){ 
      var column = this; 

      var sum = column 
       .data() 
       .reduce(function (a, b) { 
        a = parseInt(a, 10); 
        if(isNaN(a)){ a = 0; }     

        b = parseInt(b, 10); 
        if(isNaN(b)){ b = 0; } 

        return a + b; 
       }); 

      $(column.footer()).html('Sum: ' + sum); 
     }); 
    } 
}); 

는 예를 들어 this JSFiddle를 참조하십시오.

UPDATE

당신이 모든 "그리기"이벤트에 호출됩니다 바닥 글 표시 콜백 함수를 정의 할 수 있습니다 footerCallback 속성도있다.

initCompletefooterCallback의 차이점은 모든 "draw"이벤트에서 initComplete이 한 번 호출되고 footerCallback이 호출된다는 것입니다.

전체 테이블의 합계를 표시하려면 initComplete이면 충분합니다. 그렇지 않은 경우 현재 페이지와 관련된 푸터 데이터를 표시해야하는 경우 (Footer callback example처럼) footerCallback을 대신 사용하십시오.

+0

'initComplete';) 너무 가까웠습니다. 답변 해주셔서 감사합니다! – skepnaden

+0

업데이트가 필요합니다. 이 솔루션은 빈 열에서는 작동하지 않습니다. – Siteogra

+0

@Siteogra 예를 들어 [this jsFiddle] (http://jsfiddle.net/d49c8jLL/175/)을 참조하십시오. –

1

믹스. 공백이 0으로 바뀝니다

"initComplete": function (settings, json) { 
     this.api().columns('.sum').every(function() { 
      var column = this; 

      var intVal = function (i) { 
       return typeof i === 'string' ? 
       i.replace(/[\$,]/g, '') * 1 : 
        typeof i === 'number' ? 
         i : 0; 
      }; 

      var sum = column 
       .data() 
       .reduce(function (a, b) { 
        return intVal(a) + intVal(b); 
       }); 

      $(column.footer()).html('Sum: ' + sum); 
     }); 
    }