无法同时实现KeystoneJS分页

时间:2017-04-11 07:38:40

标签: javascript pagination keystonejs locals

我试图在keystone js中实现分页,并且我按照以下方式执行:

模型

var keystone = require('keystone');
var Types = keystone.Field.Types;

var Test = new keystone.List('Test', {
    map: {name: 'title'},
    label: 'Test',
    singular: 'Test',
    plural: 'Tests',
    autokey: {path: 'slug', from: 'title', unique: true} 
});

Test.add({
    description: {type: Types.Html, wysiwyg: true, height: 300 }
});

Test.register();

路线/视图

var keystone = require('keystone');
var Test = keystone.list('Test');
exports = module.exports = function(req, res) {

    var view = new keystone.View(req, res);
    var locals = res.locals;

    // Set locals
    locals.section = 'test';
    locals.data = {
        test: []
    };


    Test.paginate({
        page: req.query.page || 1,
        perPage: 2,
        maxPages: 5
    })
    .exec(function(err, results) {
        locals.data.test = results;
        next(err);
    });

    // Load All Terms
    view.query('test', keystone.list('Test').model.find()); 

    // Render view
    view.render('test');
}

在Index.js

app.all('/test', routes.views.test);

在middleware.js

res.locals.navLinksFooter = [
    { label: 'Test', key: 'test', href: '/test' },
    .....
];

模板

 <div class="row">
    <div class="col-xs-12">
        <span class="pull-right">
            {{>pagination}}
        </span>
    </div>
</div>

<div class="row row-content panel--outer panel--outer--trans">
    <div class="col-xs-12" id="panel--news-detail">
        {{# each test}}
            <p>{{{description}}}</p>
        {{/each}}
    </div>
</div>

不幸的是,当我尝试转到该页面时,我收到以下错误:

&#34; ReferenceError:next未定义&#34;

一些指针和可能的原因。我已经使用以下方式在单独的页面上为博客帖子设置了分页:

locals.data = {
    test: []
};

如果我发表评论&#34; next(错误)&#34;,会出现分页按钮,但点击箭头会将我带到博客/新闻项目的第二页。

事情显然在这里混淆了。我怀疑是因为我对当地人的处理不当,但我似乎无法在关键网站上找到关于当地人应该如何工作的深入解释。

我最终想要将不同的过滤器应用于mongo集合并让它在一系列引导选项卡中运行,但我认为我需要首先解决基础知识。

有没有人遇到类似的情况并且能够找到解决方案?

1 个答案:

答案 0 :(得分:1)

next是一个在Express路线中运行的回调函数。你根本没有将它定义为路线中的参数;部分问题还在于您尝试同步加载数据,这在此处不起作用。

使用view.init函数公开next函数,然后在将数据库中的信息加载到locals.data时调用它。

<强>路线/视图

var keystone = require('keystone');
var Test = keystone.list('Test');
exports = module.exports = function(req, res) {

    var view = new keystone.View(req, res);
    var locals = res.locals;

    // Set locals
    locals.section = 'test';
    locals.data = {
        test: []
    };


    view.on('init', function (next) {
        Test.paginate({
            page: req.query.page || 1,
            perPage: 2,
            maxPages: 5
        })
        .exec(function(err, results) {
            locals.data.test = results;
            next(err);
        });
    });

    // Load All Terms
    view.query('test', keystone.list('Test').model.find()); 

    // Render view
    view.render('test');
}