KeystoneJS:如何在填充元素中填充数据?

时间:2016-04-22 01:59:41

标签: javascript mongoose keystonejs

我有一个页面,它添加了集合。在这些集合中有更多元素。如何填充集合及其中的元素。

3个型号:

Page.add({
    title: { type: String, initial: true, required: true},
    collections: { type: Types.Relationship, ref: 'Collection', many: true, sortable: true}
});

集合

Collection.add({
    title: { type: String, initial: true, required: true},
    elements: { type: Types.Relationship, ref: 'Element', many: true, sortable: true}
});

元素

Element.add({
    title: { type: String, initial: true, required: true}
});

我想加载它们......

view.on('init', function(next) {

    var q = keystone.list('page').model.findOne({
        state: 'published',
        }).populate('collections collections[*].elements');

    q.exec(function(err, result) {
        if (result !== null) {
            locals.data.page = result;
        }else{
            return res.status(404).render('errors/404')
        }
    });

});

我想我可以这样做......

var async = require('async');

view.on('init', function(next) {

    var q = keystone.list('page').model.findOne({
        state: 'published',
        });

    q.exec(function(err, result) {
        locals.data.page = result;

        var cl = locals.data.page.collections;
        async.forEachOf( cl, function(collection, i, callback){
            keystone.list('Collection').model.findById(collection).populate('elements').exec(function(err, elements) {

                cl = locals.data.page.collections;
                if (collection !== null) {

                    cl[i] = elements;       
                    callback();
                }
            });
        }, function(err){
            next(err)
        });
    }
});

但必须有更好的方法。

1 个答案:

答案 0 :(得分:0)

你可以尝试深度填充类似下面的代码

var q = keystone.list('page').model.findOne({
    state: 'published',
    }).populate({path: 'collections', populate: ['element']});

q.exec(function(err, result) {
    if (result !== null) {
        locals.data.page = result;
    }else{
        return res.status(404).render('errors/404')
    }
});