Метеоритные реактивные источники

У меня есть приложение, в котором есть 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;
        }
})

Предположим, что добавлена ​​новая книга или новая подписка, или другой пользователь регистрирует ее, будут ли обновляться данные подкниг? считается ли он реактивным (поскольку он содержит реактивные данные)?


person younes sofiane    schedule 21.04.2016    source источник
comment
Вы все очень усложняете: вы можете просто вернуть курсор в Books.find (т.е. просто return Book.find(...); в свой шаблон. Как только вы выберете, вы получите данные. Курсор реактивен, но данные после извлечения - нет.   -  person MrE    schedule 22.04.2016
comment
Будет ли это работать, даже если я вернусь внутри Subscribtion.find(...).forEach()?   -  person younes sofiane    schedule 22.04.2016
comment
не будет работать, если вы вернетесь из forEach, так как вы вернетесь только в родительскую область.   -  person Michel Floyd    schedule 22.04.2016


Ответы (1)


Я предлагаю вам упростить это и опубликовать уже объединенную коллекцию Subscriptions и Books с сервера, используя reywood:publish-composite. пакет.

Сервер:

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()

Это также ускорит ваше приложение за счет уменьшения количества подписок и книг, которые вы отправляете с сервера клиенту.

Примечание: со временем вам может показаться, что название коллекции Subscriptions сбивает с толку, поскольку этот термин является основной концепцией Meteor.

person Michel Floyd    schedule 22.04.2016