我有一个应用程序,其中有5个集合:一个用于书籍,一个用于类型(书籍,如幻想,科幻......),一个用于语言,一个用于订阅(包括type_id,lang_id和user_id)和最后一个如果是Meteor.users。
我创建了这个辅助函数来检索适合每个用户订阅的书籍(我正在使用角度流星)
$scope.helpers({
userBooks:function(){
var subBooks=[];
var books;
var user_id=Meteor.userId();
Subscribtions.find({user_id:user_id}).forEach(function(sub){
books=Books.find({type_id:sub.type_id,lang_id:sub.lang_id}).fetch();
for(var i=0;i<books.length;i++){
subBooks.push(books[i]);
}
});
return subBooks;
}
})
假设添加了新书或新订阅,或者其他用户记录了它,那么subBooks数据会更新吗?它被认为是被动的(因为它包含被动数据)?
答案 0 :(得分:1)
我建议您使用reywood:publish-composite包来简化此操作并从服务器发布已加入的Subscriptions
和Books
集合。
服务器:
Meteor.publishComposite('mySubs', {
find: function() { // Find all the subscriptions for the current user
return Subscriptions.find({ userId: this.userId });
},
children: [
{
find: function(sub) { // find books related to the current subscription 'sub'
return Books.find({ type_id: sub.type_id, lang_id: sub.lang_id});
}
}
]
});
在客户端:
Meteor.subscribe('mySubs');
然后,您只需Books.find()
通过减少从服务器发送到客户端的订阅和书籍数量,这也可以使您的应用更快。
注意:随着时间的推移,您可能会发现命名集合订阅会让人感到困惑,因为该术语是Meteor的核心概念。