【问题标题】:Meteor reactive sources流星反应源
【发布时间】:2016-04-21 23:08:56
【问题描述】:

我有一个应用程序,其中有 5 个集合:一个用于书籍,一个用于类型(书籍,如幻想、科幻......),一个用于语言,一个用于订阅(包括 type_id、lang_id 和user_id) 和最后一个如果 Meteor.users。

我创建了这个辅助函数来检索适合每个用户订阅的书籍(我正在使用 angular-meteor)

$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;
        }
})

假设添加了新书或新订阅,或者另一个用户记录了它,子书数据会更新吗?它被认为是响应式的(因为它包含响应式数据)吗?

【问题讨论】:

  • 你让事情变得非常复杂:你可以简单地将光标返回 Books.find (即只是 return Book.find(...); 到你的模板。一旦你获取,你就会得到数据。光标是反应性的,但是一旦获取的数据不是。
  • 即使我在 Subscribtion.find(...).forEach() 中进行了返回,它会起作用吗?
  • 如果您从 forEach 内部返回,不会工作,因为您只会返回父范围。

标签: angularjs meteor angular-meteor


【解决方案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 的核心概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2017-05-15
    相关资源
    最近更新 更多