流星反应源

时间:2016-04-21 23:08:57

标签: angularjs meteor angular-meteor

我有一个应用程序,其中有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数据会更新吗?它被认为是被动的(因为它包含被动数据)?

1 个答案:

答案 0 :(得分: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的核心概念。