Paginate相关模型的结果

时间:2015-12-14 23:38:55

标签: node.js loopbackjs strongloop

这是之前question的另一个跟进。只涉及两个模型:categorygame共享hasMany关系。示例:端点/Categories/1001/games/mature列出fighting类别中mature标记设置为true的所有游戏。但是,我无法paginate回复。基于下面显示的代码分页的正确方法是什么?我想一次只显示10个结果。

  

公共/模型/ category.js

Category.mature = function(id, callback) {
    var app = this.app;
    var Game = app.models.game;
    Category.findById(id, {}, function(err, category) {
        if (err) return callback(err);
        //Now call the Game find method
        Game.find({
            "where": {
                categoryId: id,
                mature: true
            }
        }, function(err, gameArr) {
            if (err) return callback(err);
            callback(null, gameArr);
        });
    });
}


Category.remoteMethod(
'mature', {
    accepts: [{
        arg: 'id',
        type: 'number',
        required: true
    }],
    // mixing ':id' into the rest url allows $owner to be determined and used for access control
    http: {
        path: '/:id/games/mature',
        verb: 'get'
    },
    returns: {
        arg: 'games',
        type: 'array'
    }
}
);

表/模型

catgories

category_name       category_id 
-------------       -----------
fighting            1001
racing              1002
sports              1003

games

game_id         game_name           category_id     mature      description           published_date
-----------     ------------        -----------     -------     -----------           --------------
13KXZ74XL8M     Tekken              10001           true        Published by Namco.     1994
138XZ5LPJgM     Forza               10002           false       Published by Microsoft  2005

API结果:

games [ 
{
gameName: 'Tekken', 
gameInfo : 
[
    { 
        description : 'Published by Namco.',
        published_date : '1994'
    }
],
        categorName: 'fighting', 
        categoryId: 1001, 
        mature: true 
}
.....
]

1 个答案:

答案 0 :(得分:2)

如果您遇到上述代码,则需要下载完整的游戏集,然后在前端进行分页。无法向您的查询发送limitskip值,没有其他办法。

如果您可以更改此代码并向remote方法添加参数,则使用Node API的基础mysql连接器格式如下所示:

Game.find({
  "where": {
    categoryId: id,
    mature: true
  },
  "limit": 10, // 10 per page
  "skip": 10 // hard coded for page 2, this needs to be passed in
}, function(err, gameArr) {
  if (err) return callback(err);
  callback(null, gameArr);
});

应将limit和skip的值添加到远程方法定义和注册中,然后UI可以根据显示的页面发送动态值。

跳过过滤器上的页面也有一个分页示例:

https://docs.strongloop.com/display/public/LB/Skip+filter

如果这将使用某种类型的UI库(如Angular SDK),您可以使用lb-ng生成器脚本和在那里创建的模型在Controller级别进行相同的查询。您还可以在那里添加分页值,无需自定义远程方法。

更新

要将跳过和限制数添加到远程方法,您需要更新远程方法签名,accepts数组将更改为

accepts: [
  {
    arg: 'id',
    type: 'number',
    required: true
  },
  {
    arg: 'skip',
    type: 'number',
    required: true
  },
  {
    arg: 'limit',
    type: 'number',
    required: true
  }
]

然后将相同的2个新参数添加到方法本身:

Category.mature = function(id, skip, limit, callback) {
  // ...your code...
});

此时您可以使用查询参数调用它,例如仅附加到现有路径的?skip=10&limit=10。或者,您可以将http.path更改为

path: '/:id/games/mature/:skip/:limit'

然后使用/1/games/mature/10/10调用资源,以使用参数化的URL获得相同的结果。