使用DataTables的Sails中的服务器端分页

时间:2015-06-11 06:09:50

标签: jquery pagination datatables sails.js waterline

我目前正在使用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会根据iTotalDisplayRecordsiTotalRecords自动添加页码,但事实证明它并非如此。我的代码有什么问题或者我认为错了,我必须是在我的DataTable中添加页码的人吗?

Here is the output

1 个答案:

答案 0 :(得分:2)

我认为问题在于您在iTotalDisplayRecords中返回了错误的值:

"iTotalRecords": 11, 
"iTotalDisplayRecords": 10

来自manual

  

int iTotalRecords
  过滤前的总记录(即总数   数据库中的记录数量)

     

int iTotalDisplayRecords
  过滤后的总记录(即之后的记录总数)   已应用过滤 - 而不仅仅是记录的数量   在此结果集中返回)

未执行过滤时,iTotalRecords应等于iTotalDisplayRecords

要解决此问题,您需要在应用过滤后计算记录总数,并将该值用于iTotalDisplayRecords而不是usr.length