【发布时间】:2015-07-28 08:52:16
【问题描述】:
默认
我创建了ajax datatable,这些行有时由表末尾的 json 填充:jsfiddle,有时在表的顶部。这取决于 ajax 响应的时间。
推荐输出
我有来自两个不同来源的两个输入 json,输出是这个表:
<table>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
...
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
<tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
<tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
<tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
...
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>
来自 2.json 的行被插入到表中(从 1.json 创建)到特定位置。这个位置是不变的,1.和2.json数据的长度是不变的。
第一个解决方案
我必须添加包含数字的第一列并按其降序对数据表进行排序 - jsfiddle。我可以隐藏第一列jsfiddle,但我更喜欢使用自定义函数,因为它在 IE8 中不起作用。
var t = $("#tab1").DataTable({
"ajax": "data1.json",
columnDefs: [
{ className: "hide", "targets": [ 0 ] },
],
"columns": [
{ "data": "id"},
{ "data": "cat1"},
{ "data": "cat2"},
{ "data": "cat3"}
]
});
$.ajax({
type: "GET",
url: "data2.json",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
t.rows.add(response.data);
t.draw();
}
});
创意 - 自定义功能
我尝试创建自定义函数 rows.addinposition(rows, position),但它作为函数 rows.add() 工作。
我在line 7879处复制并修改了jquery.dataTables.js中的函数rows.add,我将out.push()更改为out.splice()splice docs。
我知道,不推荐,更好的是extend datatables api...
_api_register( 'rows.addinposition()', function ( rows, position ) {
var newRows = this.iterator( 'table', function ( settings ) {
var row, i, ien;
var out = [];
for ( i=0, ien=rows.length ; i<ien ; i++ ) {
row = rows[i];
if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
//ROWS.ADD USE OUT.PUSH
//out.push( _fnAddTr( settings, row )[0] );
//CHANGED TO OUT.SPLICE
out.splice( position, 0, _fnAddTr( settings, row )[0] );
}
else {
out.splice( position, 0, _fnAddData( settings, row ) );
}
}
console.log(out);
return out;
}, 1 );
// Return an Api.rows() extended instance, so rows().nodes() etc can be used
var modRows = this.rows( -1 );
modRows.pop();
modRows.push.apply( modRows, newRows.toArray() );
return modRows;
} );
如果你能帮助我,那就太好了。
我发现了类似的问题:
-
SO link:1.9 版数据表中的函数
fnAddData() - SO link - 将多行添加到数据表的末尾
- SO link - 没有答案
- datatables forum link - 旧版本,没有答案(我认为)
编辑
谢谢davidkonrad,不过我在jsfiddle测试了一下,发现了2个问题:
- 排序错误 2.,1.,而不是 1.,2. - 我认为简单的问题
- 有时这个添加的行在表格的顶部,有时在正确的位置。随机。 - 可能是个大问题
我在jsfiddle调试它,它的行为很奇怪:
console.log('rowCount = '+rowCount);
如果行在顶部(错误位置)返回:
rowCount = 0
rowCount = 1
并且for 没有循环,因为萤火虫没有显示var i。
如果他们处于有利位置,返回:
rowCount = 5
rowCount = 6
和for 循环并在此示例中返回var i:
1.循环:
i = 5
i = 4
i = 3
2.循环:
i = 6
i = 5
i = 4
i = 3
我错过了什么吗?为什么顺序很奇怪?
【问题讨论】:
-
您能解释一下您要达到的目标吗?为什么需要在特定位置插入行,这是什么原因?
-
我在问题中添加了推荐的输出。
-
目前还不清楚为什么您要这样做。让我们continue the discussion in chat。
标签: javascript jquery datatables