这很糟糕,但我不知道在服务器上获得反应性。我也在使用发布复合包:https://github.com/englue/meteor-publish-composite
我正在使用铁路由器,其中布局.html是主模板。在布局.js中,我有:
Template.layout.created = function(){
this.autorun(()=>{
this.subscribe('currentUser')
this.subscribe('friendsRecordsAnswers')
this.subscribe('myRecordsGamesRounds')
this.subscribe('queries')
})
}
以下是我的一个出版物的例子:
Meteor.publishComposite('myRecordsGamesRounds', function(){
if(this.userId){
return {
find(){
return Records.find({userId: this.userId});
},
children:[{
find(record){
return Games.find({_id: record.gameId})
},
children:[{
find(game){
return Rounds.find({gameId: game._id});
}
}]
},
]
};
}
})
这个应用是一个游戏,你可以邀请其他用户。但是,当新用户注册时,现有用户必须先刷新页面,然后才能邀请他们加入游戏。我目前有一个运行 Meteor.disconnect() 和 Meteor.reconnect() 的 2000ms 的 setInterval,到目前为止实际上工作正常。但我相信有更好的方法。谢谢!
在具有 2 个子级的 github 示例中,您可以看到第二级子级引用了 2 级父级:按顺序comment
和post
:
Meteor.publishComposite('topTenPosts', {
find: function() {
// Find top ten highest scoring posts
return Posts.find({}, { sort: { score: -1 }, limit: 10 });
},
children: [
{
find: function(post) {
// Find post author. Even though we only want to return
// one record here, we use "find" instead of "findOne"
// since this function should return a cursor.
return Meteor.users.find(
{ _id: post.authorId },
{ limit: 1, fields: { profile: 1 } });
}
},
{
find: function(post) {
// Find top two comments on post
return Comments.find(
{ postId: post._id },
{ sort: { score: -1 }, limit: 2 });
},
children: [
{
find: function(comment, post) {
// Find user that authored comment.
return Meteor.users.find(
{ _id: comment.authorId },
{ limit: 1, fields: { profile: 1 } });
}
}
]
}
]
});
你没有在代码中这样做,你基本上只传递了第一级子引用,而不是根。所以我认为你只需要做:
Meteor.publishComposite('myRecordsGamesRounds', function(){
if(this.userId){
return {
find(){
return Records.find({userId: this.userId});
},
children:[{
find(record){
return Games.find({_id: record.gameId})
},
children:[{
find(game, record){
return Rounds.find({gameId: game._id});
}
}]
},
]
};
}
})
我会认为,因为你把根传给了底层的孩子,它就会回头看它。
我在这里可能错了...我用过这个包,但不久前放弃了它,因为只要你想做搜索,你最终会得到一个巨大的混乱。
我更喜欢使用 https://github.com/peerlibrary/meteor-reactive-publish 它更干净,可以让您在代码中执行所需的操作,而不是嵌套对象。