2015-09-28 73 views
2

我已經這樣做了根據我的服務器返回的數據創建列數。我想檢查數組中的數據是否與列名匹配,如果是,則返回yes,否則返回no。DataTables rows.add(array).draw()被多次調用

function initTable(userJvmsArray) { 
      var collumnsCallbacks = [{ 
       title: "Username", 
       data: "username" 
      }]; 

      for (var i = 0; i < $scope.unique.length; i++) { 
       $('#nameColumn').after('<th>' + $scope.unique[i] + '</th>'); 
       var jvm = $scope.unique[i]; 
       var col = { 
        title: jvm, 
        data: function(data, type, row) { 
         var data2 = data; 
         var jvms = $scope.unique; 
         for (var k = 1; k < jvms.length; k++) { 
          console.log(jvms); 
          for (var j = 0; j < data2.myarray.length; j++) { 
           if (table.column(k).title() == data2.myarray[j].Name) { 
            console.log(table.column(k).title() + " = " + data2.myarray[j].Name + " YES"); 
            return "yes"; 
           } else { 
           console.log(table.column(k).title() + " = " + data2.myarray[j].Name + " NO"); 
            return "no"; 
           } 
          } 
         } 


        } 
       }; 
       collumnsCallbacks.push(col); 
       $scope.columns = collumnsCallbacks; 
      } 
      $scope.myTable = $('#myTable').DataTable({ 
       'paging': true, 
       "pageLength": 3, 
       'columns': collumnsCallbacks 
      }); 

問題是功能似乎運行超過一次,並錯誤地填充表格多,這是我的控制檯日誌:

["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 

["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO myctrl.controller.js:69 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO myctrl.controller.js:69 

["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO myctrl.controller.js:69 

["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO myctrl.controller.js:69 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user1: myword = myword YES myctrl.controller.js:66 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO myctrl.controller.js:69 
["myword", "secondword", fastLoop: function, fastLoopAsc: function] myctrl.controller.js:63 
user11: myword = secondword NO 

回答

0

原因

函數由於DataTables的工作方式,多次執行columns.data。雖然它不清楚,但可能會多次調用此函數,因爲DataTables會針對它需要的不同數據類型調用它 - 類型檢測,排序,篩選和顯示(type == 'type',type == 'sort',type == 'filter'type == 'display')。它也可以被調用來設置單元格的數據(set == 'set')。

功能定義如下,更多詳細信息請參見columns.data

data: function(row, type, set, meta){ } 

注意

  • 您可以使用columns.render這可以被認爲是隻讀的同伴columns.data並沒有那麼複雜。
  • 你的邏輯有兩個循環的缺陷,它們將只運行一次,因爲你立即在內循環中返回"yes""no"值。我無法更正您的代碼,因爲您不清楚您要做什麼。
+0

有沒有辦法讓它只被調用一次?或者解決這個問題的另一種方法?謝謝! – orange

+0

@orange,目前還不清楚爲什麼你對'columns.data'使用函數。你是否想在某些條件下在單元格中顯示「是」和「否」?此外,我沒有看到在所使用的標題中使用的「rows.add(array).draw()」。 –

+0

是的!這就是我想要的。 我在稍後調用draw。這段代碼位於一個名爲initTable的函數中,在此函數調用之後,我執行rows.add(array).draw()。 – orange