流星反应性来源
问题描述:
我有一个应用程序,其中有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数据会更新吗?它被认为是反应性的(因为它包含反应性数据)?
答
我建议您简化此操作,并使用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的核心概念。
您正在使事情变得非常复杂:您可以简单地将Books.find上的光标返回(即,仅返回Book.find(...);'到您的模板中 只要您获取数据,您就可以获取数据。游标是被动的,但是一次获取的数据不是。 – MrE
即使我在Subscribtion.find(...)。forEach()中做了返回,它会工作么? –
如果从forEach因为你只能回到父范围。 –