这是之前question的另一个跟进。只涉及两个模型:category
和game
共享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
}
.....
]
答案 0 :(得分:2)
如果您遇到上述代码,则需要下载完整的游戏集,然后在前端进行分页。无法向您的查询发送limit
和skip
值,没有其他办法。
如果您可以更改此代码并向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获得相同的结果。