2017-08-29 26 views
0

我已經實現了用於jQuery的Datatables插件。我在使用columns.data選項在數據加載到表中之前對我的數據執行操作。數據表插件在更新單元格時返回舊數據

由於我更新數據時有一個問題,我所引用的columns.data選項文檔和注意到,當更新發生時,例如設置row參數等於val(我認爲會更新row參數,因此。基本數據。但是,我發現這是不正確

編輯:要澄清,這個問題似乎是,當我分配row = valrowval都是對象時type == 'set'如果我給你的每個屬性。單獨(例如row.information = val.information),那麼它的工作原理是否有原因不能將對象重新分配給新的對象?

下面是一個例子,抓住什麼,我試圖做的:

var initialData = [{ "information": "Google Link", "weblink": "http://www.google.com" }]; 
 

 
var newDataObj = { "information": "Yahoo Link", "weblink": "http://www.yahoo.com" }; 
 

 
$('#example').DataTable({ 
 
    "data": initialData, 
 
    "columns": [ 
 
     { "data": "information" }, 
 
     { 
 
     "data": function(row, type, val, meta){ 
 
      if(type === 'set'){ 
 
      \t row = val; //ASSIGNING AN OBJECT TO AN OBJECT 
 
       \t return; 
 
      } 
 
       
 
      data = '<a href="' + row.weblink + '">' + row.information + '</a>'; 
 
       
 
      return data; 
 
     } 
 
     } 
 
    ] 
 
}); 
 

 
$('#update_link').on('click', function(){ 
 
\t 
 
\t var table = $('#example').DataTable(); 
 
\t table.cell(0,1).data(newDataObj).draw(); 
 
});
<html> 
 
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://cdn.datatables.net/r/dt/dt-1.10.9/datatables.min.css" rel="stylesheet"/> 
 
<script src="https://cdn.datatables.net/r/dt/dt-1.10.9/datatables.min.js"></script> 
 
</head> 
 
<body> 
 
<table class="display" id="example"> 
 
    <thead> 
 
     <tr> 
 
      <th>Information</th> 
 
      <th>Link</th> 
 
     </tr> 
 
    </thead> 
 
</table> 
 

 
<div> 
 
    <button id="update_link">Update Link</button> 
 
</div> 
 
</body> 
 
</html>

回答

0

我想通了,簡單地將對象分配row到一個新的對象val不改變原來的對象這被傳遞到columns.data函數。我必須改爲「改變參數的內部」,這些改變會傳播回原來的對象。更多信息可以在這裏找到:

Is JavaScript a pass-by-reference or pass-by-value language?

這樣做的原因是因爲JavaScript中的對象實際上是按值傳遞但那是傳遞的值是一個引用(通過按引用傳值)。

分配給每個內部參數可以解決問題。

... 
row.information = val.information; 
row.weblink = val.weblink; 
... 

所以看起來我並沒有完全明白call-by-sharing

var initialData = [{ "information": "Google Link", "weblink": "http://www.google.com" }]; 
 

 
var newDataObj = { "information": "Yahoo Link", "weblink": "http://www.yahoo.com" }; 
 

 
$('#example').DataTable({ 
 
    "data": initialData, 
 
    "columns": [ 
 
     { "data": "information" }, 
 
     { 
 
     "data": function(row, type, val, meta){ 
 
      if(type === 'set'){ 
 
      \t row.information = val.information; //debugger; 
 
       row.weblink = val.weblink; 
 
       \t return; 
 
      } 
 
       
 
      data = '<a href="' + row.weblink + '">' + row.information + '</a>'; 
 
       
 
      return data; 
 
     } 
 
     } 
 
    ] 
 
}); 
 

 
$('#update_link').on('click', function(){ 
 
\t 
 
\t var table = $('#example').DataTable(); 
 
\t table.cell(0,1).data(newDataObj).draw(); 
 
});
<html> 
 
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://cdn.datatables.net/r/dt/dt-1.10.9/datatables.min.css" rel="stylesheet"/> 
 
<script src="https://cdn.datatables.net/r/dt/dt-1.10.9/datatables.min.js"></script> 
 
</head> 
 
<body> 
 
<table class="display" id="example"> 
 
    <thead> 
 
     <tr> 
 
      <th>Information</th> 
 
      <th>Link</th> 
 
     </tr> 
 
    </thead> 
 
</table> 
 

 
<div> 
 
    <button id="update_link">Update Link</button> 
 
</div> 
 
</body> 
 
</html>