我目前正在使用DataTables的服务器端选项,我目前的问题是数据表中的页码只显示1.要进一步说明这里是我的代码:
使用Javascript:
var oTable1 = $('#users-table').dataTable({
"bDestroy": true,
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "/v1/users",
"bPaginate": true,
"aoColumns": [
{ "mData": "id" },
{ "mData": "username" },
{ "mData": "name" },
{ "mData": "acctype" },
{ "mData": "country" },
{ "mData": "createdAt" },
{ "mData": "button" }
]
});
/ V1 /用户:
viewAll: function(req, res, next) {
var colS = "";
switch(req.query.iSortCol_0){
case '0': colS = 'id'; break;
case '1': colS = 'username'; break;
case '2': colS = 'firstname'; break;
case '3': colS = 'acctype'; break;
case '4': colS = 'country'; break;
case '5': colS = 'createdAt'; break;
default: break;
};
var options = {
sort: colS+' '+req.query.sSortDir_0,
or: [
{ acctype: { 'contains': req.query.sSearch }},
{ id: { 'contains': req.query.sSearch }},
{ username: { 'contains': req.query.sSearch }},
{ lastname: { 'contains': req.query.sSearch }},
{ firstname: { 'contains': req.query.sSearch }},
{ country: { 'contains': req.query.sSearch }},
{ createdAt: { 'contains': req.query.sSearch }}
],
limit: req.query.iDisplayLength
};
console.log(req.query);
console.log(req.query.sSearch);
//console.log(options);
var p = req.query.iDisplayStart+1;
//console.log(req.query.iDisplayStart);
Users.find(options).paginate({ page: p, limit: req.query.iDisplayLength }).exec(function(err, usr){
if(err){
res.send(500, { error: 'DB error' });
} else {
var retuser = [];
usr.forEach(function(user){
retuser.push({ id: user.id, username: user.username, name: user.firstname+" "+user.lastname, acctype: user.acctype, country: user.country, createdAt: user.createdAt, button: "<a class='blue' href='#view-user' data-toggle='modal' id='user-info'> <i class='icon-zoom-in bigger-130'></i></a>" });
});
Users.count().exec(function(err, result){
var json = {
aaData: retuser,
iTotalRecords: result,
iTotalDisplayRecords: usr.length
};
res.contentType('application/json');
res.json(json);
});
}
});
},
基本上发生的是: 当我在
中更改页面时.paginate({page:p,limit:req.query.iDisplayLength})
到2,它显示了第2页应该显示的内容,如果我将其更改为1,则显示第1页中应显示的内容。当更改要显示的记录数时,它会显示第11条记录。所以我想如何从控制器中检索数据没有问题。
我认为DataTables会根据iTotalDisplayRecords
和iTotalRecords
自动添加页码,但事实证明它并非如此。我的代码有什么问题或者我认为错了,我必须是在我的DataTable中添加页码的人吗?
答案 0 :(得分:2)
我认为问题在于您在iTotalDisplayRecords
中返回了错误的值:
"iTotalRecords": 11,
"iTotalDisplayRecords": 10
来自manual:
int
iTotalRecords
过滤前的总记录(即总数 数据库中的记录数量)int
iTotalDisplayRecords
过滤后的总记录(即之后的记录总数) 已应用过滤 - 而不仅仅是记录的数量 在此结果集中返回)
未执行过滤时,iTotalRecords
应等于iTotalDisplayRecords
。
要解决此问题,您需要在应用过滤后计算记录总数,并将该值用于iTotalDisplayRecords
而不是usr.length
。