2016-04-21 111 views
0

我有一个应用程序,其中有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

您正在使事情变得非常复杂:您可以简单地将Books.find上的光标返回(即,仅返回Book.find(...);'到您的模板中 只要您获取数据,您就可以获取数据。游标是被动的,但是一次获取的数据不是。 – MrE

+0

即使我在Subscribtion.find(...)。forEach()中做了返回,它会工作么? –

+0

如果从forEach因为你只能回到父范围。 –

回答

1

我建议您简化此操作,并使用reywood:publish-composite包从服务器发布已加入的SubscriptionsBooks集合。

服务器:

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的核心概念。