如何在路由级别使用订阅结果进行其他订阅?

时间:2014-10-03 20:31:22

标签: meteor iron-router

我有一个模板,显示来自三个不同集合CarsCarPaintsCarPaintTypes的文档。我知道我在路由器级别需要所有这些。该模板将显示Car文档,引用CarPaints的所有Car以及分别引用返回的CarPaintTypes的所有CarPaints(认为嵌套列表) )。到模板的路线从代表id的网址中获取Car._id

Cars集合和CarPaints集合都使用Car._id作为字段(它是_id集合的原生Cars和字段在CarPaints集合中)这很容易。但是,CarPaintTypes使用CarPaint._id作为对其所属CarPaint的引用。

所以我有三个出版物:

Meteor.publish('car', function(carId) {
   return Cars.find({_id: carId});
});

Meteor.publish('carPaints', function(carId) {
   return CarPaints.find({carId: carId});
});

Meteor.publish('carPaintTypes', function(carPaintId) {
   return CarPaintTypes.find({carPaintId: carPaintId});
});

我的路线如下:

this.route('car', {
    path: '/car/:_id',

    waitOn: function() {    

        return [Meteor.subscribe('car', this.params._id),
                Meteor.subscribe('carPaints', this.params._id)];
                // Can't figure out how to subscribe to or publish
                // the carPaintTypes using all the results of what gets
                // returned by 'carPaints'
    }   
});

我的问题是CarPaintTypes没有Car._id字段,只有CarPaint._id引用CarPaint文档。我在何处以及如何将订阅结果发送到carPaints并将每个返回订阅的carPaint文档传递给carPaintTypes?或者有没有办法将它们全部合并到出版物中?以后在我的助手中做得更好吗?我想因为我知道在路由级别需要什么,所有的订阅调用都应该在路由代码中。

2 个答案:

答案 0 :(得分:1)

你可以在Meteor.publish方法中抓取所有3个游标,然后只返回它们:

Meteor.publish('carThings', function(carId){
   var carPaint =  CarPaints.findOne({carId:carId});
   return [
     Cars.find({_id: carId}),
     CarPaints.find({carId: carId}),
     CarPaintTypes.find({carPaintId: carPaint._id});
   ]
})

在客户端:

this.route('car', {
    path: '/car/:_id',

    waitOn: function() {    

        return [Meteor.subscribe('carThings', this.params._id)]


    }
}       

答案 1 :(得分:0)

在Kuba Wyrobek的帮助下,我明白了。对于我想要实现的目标,发布看起来像这样:

Meteor.publish('carThings', function(carId){
    var carPaints = CarPaints.find({carId: carId}).fetch();
    return [
        Cars.find({_id: carId}),
        CarPaints.find({carId: carId}),
        CarPaintTypes.find({carPaintId: {$in: _.pluck(carPaints, "_id")}})
    ];
});

我没有得到你可以在你的出版物块内进行操作。这超级酷,灵活。谢谢你的帮助。