Table 使用 aui 分页和数据表排序
Table with aui-pagination and datatable-sort
我正在使用 AlloyUI 显示带有分页 + 数据table-排序的 table。
问题:数据仅在当前页面上排序。
相反,我想在每次单击列时对所有数据进行排序,并希望将用户发送回第一页。
我的代码是如何工作的:我将我的大 table 分成小的 link 每个 table 一个页面。
这是我的代码:
YUI().use('aui-datatable', 'aui-pagination', 'datatable-sort', function (Y)
{
dataPages = [{ .... }, { ... }, ... , { ... }]; => contains 18 rows
var columns = [
{ key: 'Tel', label: 'Tel', sortable: true },
...
{ key: 'Register', label: 'Register', sortable: true }
];
var dataTable = new Y.DataTable(
{ columns: columns, data: dataPages}
).render('#DataTableConsult');
new Y.Pagination(
{contentBox: '#pagination .aui-pagination-content', page: 1,
on: { changeRequest: function (event) {
var dataPageOne = new Array(); ... i fill in this first table with lines N° 0 to 6 of dataPages table
var dataPageTwo = new Array(); ... i fill in this first table with lines N° 7 to 13 of dataPages table
var dataPageThree = new Array(); ... i fill in this first table with lines N° 14 to 17 of dataPages table
if (event.state.page === 1) { dataTable.set('data', dataPageOne); }
else if (event.state.page === 2) { dataTable.set('data', dataPageTwo); }
else if (event.state.page === 3) { dataTable.set('data', dataPageThree); }}}}).render();
});
您可以通过一些更改来完成这项工作:
您需要一个包含所有数据的隐藏 DataTable
:
var hiddenDataTable = new Y.DataTable({
columns: columns,
data: dataPages
});
不监听 Paginator
的 changeRequest
事件,而是监听 pageChange
事件:
on: { pageChange: function (event) { // ...
在 pageChange
function
中,将每个页面设置为 hiddenDataTable
的 data
.
的一个片段
var hiddentData = hiddenDataTable.get('data')._items;
var dataPageOne = hiddentData.slice(0, 6);
var dataPageTwo = hiddentData.slice(6, 12);
var dataPageThree = hiddentData.slice(12, 18);
最后监听可见的DataTable
的sort
事件,对隐藏的DataTable
进行排序,设置页面为1:
dataTable.on('sort', function (event) {
hiddenDataTable.sort(event.sortBy);
pagination.set('page', 1);
});
执行此操作后,每次按列排序时都会对所有数据进行排序,并且用户将被发送到第一页。这是一个使用您的示例代码的可运行示例:
YUI().use('aui-datatable', 'aui-pagination', 'datatable-sort', function(Y) {
var dataPages = [{
Tel: '345678901',
Register: '\x65\x66\x67\x68\x69\x70\x71\x72'
}, {
Tel: '456789012',
Register: '\x66\x67\x68\x69\x70\x71\x72\x73'
}, {
Tel: '567890123',
Register: '\x67\x68\x69\x70\x71\x72\x73\x74'
}, {
Tel: '678901234',
Register: '\x68\x69\x70\x71\x72\x73\x74\x75'
}, {
Tel: '789012345',
Register: '\x69\x70\x71\x72\x73\x74\x75\x76'
}, {
Tel: '890123456',
Register: '\x70\x71\x72\x73\x74\x75\x76\x77'
}, {
Tel: '901234567',
Register: '\x71\x72\x73\x74\x75\x76\x77\x78'
}, {
Tel: '012345678',
Register: '\x72\x73\x74\x75\x76\x77\x78\x79'
}, {
Tel: '123456789',
Register: '\x73\x74\x75\x76\x77\x78\x79\x80'
}, {
Tel: '234567890',
Register: '\x74\x75\x76\x77\x78\x79\x80\x81'
}, {
Tel: '345678901',
Register: '\x75\x76\x77\x78\x79\x80\x81\x82'
}, {
Tel: '456789012',
Register: '\x76\x77\x78\x79\x80\x81\x82\x83'
}, {
Tel: '567890123',
Register: '\x77\x78\x79\x80\x81\x82\x83\x84'
}, {
Tel: '321014567',
Register: 'asdfasdf'
}, {
Tel: '786234567',
Register: 'zxcvsdfg'
}, {
Tel: '451234567',
Register: 'rtyucvbn'
}, {
Tel: '678901234',
Register: '\x78\x79\x80\x81\x82\x83\x84\x85'
}, {
Tel: '789012345',
Register: '\x79\x80\x81\x82\x83\x84\x85\x86'
}, {
Tel: '890123456',
Register: '\x80\x81\x82\x83\x84\x85\x86\x87'
}, {
Tel: '901234567',
Register: '\x81\x82\x83\x84\x85\x86\x87\x88'
}];
var columns = [{
key: 'Tel',
label: 'Tel',
sortable: true
}, {
key: 'Register',
label: 'Register',
sortable: true
}];
var hiddenDataTable = new Y.DataTable({
columns: columns,
data: dataPages
});
var dataTable = new Y.DataTable({
columns: columns
}).render('#DataTableConsult');
var pagination = new Y.Pagination({
contentBox: '#pagination .aui-pagination-content',
page: 1,
on: {
pageChange: function(event) {
var hiddentData = hiddenDataTable.get('data')._items;
var dataPageOne = hiddentData.slice(0, 6);
var dataPageTwo = hiddentData.slice(6, 12);
var dataPageThree = hiddentData.slice(12, 18);
if (event.newVal === 1) {
dataTable.set('data', dataPageOne);
} else if (event.newVal === 2) {
dataTable.set('data', dataPageTwo);
} else if (event.newVal === 3) {
dataTable.set('data', dataPageThree);
}
}
}
}).render();
dataTable.on('sort', function(event) {
hiddenDataTable.sort(event.sortBy);
pagination.set('page', 1);
});
});
<script src="http://cdn.alloyui.com/2.0.0/aui/aui-min.js"></script>
<link href="http://cdn.alloyui.com/2.0.0/aui-css/css/bootstrap.min.css" rel="stylesheet"></link>
<div id="pagination">
<ul class="pagination aui-pagination-content">
<li><a href="#">Prev</a>
</li>
<li><a href="#">1</a>
</li>
<li><a href="#">2</a>
</li>
<li><a href="#">3</a>
</li>
<li><a href="#">Next</a>
</li>
</ul>
</div>
<div id="DataTableConsult"></div>
注意:这种方法不会很好地扩展(因为它会将所有数据发送到客户端),所以我建议在后端进行这种排序并发送只有当前页面给客户端。另外,这似乎不是很用户友好。
我正在使用 AlloyUI 显示带有分页 + 数据table-排序的 table。 问题:数据仅在当前页面上排序。 相反,我想在每次单击列时对所有数据进行排序,并希望将用户发送回第一页。
我的代码是如何工作的:我将我的大 table 分成小的 link 每个 table 一个页面。
这是我的代码:
YUI().use('aui-datatable', 'aui-pagination', 'datatable-sort', function (Y)
{
dataPages = [{ .... }, { ... }, ... , { ... }]; => contains 18 rows
var columns = [
{ key: 'Tel', label: 'Tel', sortable: true },
...
{ key: 'Register', label: 'Register', sortable: true }
];
var dataTable = new Y.DataTable(
{ columns: columns, data: dataPages}
).render('#DataTableConsult');
new Y.Pagination(
{contentBox: '#pagination .aui-pagination-content', page: 1,
on: { changeRequest: function (event) {
var dataPageOne = new Array(); ... i fill in this first table with lines N° 0 to 6 of dataPages table
var dataPageTwo = new Array(); ... i fill in this first table with lines N° 7 to 13 of dataPages table
var dataPageThree = new Array(); ... i fill in this first table with lines N° 14 to 17 of dataPages table
if (event.state.page === 1) { dataTable.set('data', dataPageOne); }
else if (event.state.page === 2) { dataTable.set('data', dataPageTwo); }
else if (event.state.page === 3) { dataTable.set('data', dataPageThree); }}}}).render();
});
您可以通过一些更改来完成这项工作:
您需要一个包含所有数据的隐藏
DataTable
:var hiddenDataTable = new Y.DataTable({ columns: columns, data: dataPages });
不监听
Paginator
的changeRequest
事件,而是监听pageChange
事件:on: { pageChange: function (event) { // ...
在
的一个片段pageChange
function
中,将每个页面设置为hiddenDataTable
的data
.var hiddentData = hiddenDataTable.get('data')._items; var dataPageOne = hiddentData.slice(0, 6); var dataPageTwo = hiddentData.slice(6, 12); var dataPageThree = hiddentData.slice(12, 18);
最后监听可见的
DataTable
的sort
事件,对隐藏的DataTable
进行排序,设置页面为1:dataTable.on('sort', function (event) { hiddenDataTable.sort(event.sortBy); pagination.set('page', 1); });
执行此操作后,每次按列排序时都会对所有数据进行排序,并且用户将被发送到第一页。这是一个使用您的示例代码的可运行示例:
YUI().use('aui-datatable', 'aui-pagination', 'datatable-sort', function(Y) {
var dataPages = [{
Tel: '345678901',
Register: '\x65\x66\x67\x68\x69\x70\x71\x72'
}, {
Tel: '456789012',
Register: '\x66\x67\x68\x69\x70\x71\x72\x73'
}, {
Tel: '567890123',
Register: '\x67\x68\x69\x70\x71\x72\x73\x74'
}, {
Tel: '678901234',
Register: '\x68\x69\x70\x71\x72\x73\x74\x75'
}, {
Tel: '789012345',
Register: '\x69\x70\x71\x72\x73\x74\x75\x76'
}, {
Tel: '890123456',
Register: '\x70\x71\x72\x73\x74\x75\x76\x77'
}, {
Tel: '901234567',
Register: '\x71\x72\x73\x74\x75\x76\x77\x78'
}, {
Tel: '012345678',
Register: '\x72\x73\x74\x75\x76\x77\x78\x79'
}, {
Tel: '123456789',
Register: '\x73\x74\x75\x76\x77\x78\x79\x80'
}, {
Tel: '234567890',
Register: '\x74\x75\x76\x77\x78\x79\x80\x81'
}, {
Tel: '345678901',
Register: '\x75\x76\x77\x78\x79\x80\x81\x82'
}, {
Tel: '456789012',
Register: '\x76\x77\x78\x79\x80\x81\x82\x83'
}, {
Tel: '567890123',
Register: '\x77\x78\x79\x80\x81\x82\x83\x84'
}, {
Tel: '321014567',
Register: 'asdfasdf'
}, {
Tel: '786234567',
Register: 'zxcvsdfg'
}, {
Tel: '451234567',
Register: 'rtyucvbn'
}, {
Tel: '678901234',
Register: '\x78\x79\x80\x81\x82\x83\x84\x85'
}, {
Tel: '789012345',
Register: '\x79\x80\x81\x82\x83\x84\x85\x86'
}, {
Tel: '890123456',
Register: '\x80\x81\x82\x83\x84\x85\x86\x87'
}, {
Tel: '901234567',
Register: '\x81\x82\x83\x84\x85\x86\x87\x88'
}];
var columns = [{
key: 'Tel',
label: 'Tel',
sortable: true
}, {
key: 'Register',
label: 'Register',
sortable: true
}];
var hiddenDataTable = new Y.DataTable({
columns: columns,
data: dataPages
});
var dataTable = new Y.DataTable({
columns: columns
}).render('#DataTableConsult');
var pagination = new Y.Pagination({
contentBox: '#pagination .aui-pagination-content',
page: 1,
on: {
pageChange: function(event) {
var hiddentData = hiddenDataTable.get('data')._items;
var dataPageOne = hiddentData.slice(0, 6);
var dataPageTwo = hiddentData.slice(6, 12);
var dataPageThree = hiddentData.slice(12, 18);
if (event.newVal === 1) {
dataTable.set('data', dataPageOne);
} else if (event.newVal === 2) {
dataTable.set('data', dataPageTwo);
} else if (event.newVal === 3) {
dataTable.set('data', dataPageThree);
}
}
}
}).render();
dataTable.on('sort', function(event) {
hiddenDataTable.sort(event.sortBy);
pagination.set('page', 1);
});
});
<script src="http://cdn.alloyui.com/2.0.0/aui/aui-min.js"></script>
<link href="http://cdn.alloyui.com/2.0.0/aui-css/css/bootstrap.min.css" rel="stylesheet"></link>
<div id="pagination">
<ul class="pagination aui-pagination-content">
<li><a href="#">Prev</a>
</li>
<li><a href="#">1</a>
</li>
<li><a href="#">2</a>
</li>
<li><a href="#">3</a>
</li>
<li><a href="#">Next</a>
</li>
</ul>
</div>
<div id="DataTableConsult"></div>
注意:这种方法不会很好地扩展(因为它会将所有数据发送到客户端),所以我建议在后端进行这种排序并发送只有当前页面给客户端。另外,这似乎不是很用户友好。