使用DataTables在Sails中进行服务器端分页

3

我目前正在使用 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/users:
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


你可以使用这个:https://www.npmjs.com/package/sails-hook-datatable。它很简单直接,易于使用。 - Phil
1个回答

2

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

"iTotalRecords": 11, 
"iTotalDisplayRecords": 10

来自 手册:

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

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

当不执行过滤操作时,iTotalRecords 应该等于 iTotalDisplayRecords

为了修正问题,您需要计算应用过滤后的总记录数,并使用该值替换 usr.length 作为 iTotalDisplayRecords 的值。


谢谢!我误解了文档中的说明。我以为提到的过滤器包括我设置的限制。 - bless1204

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接