Угловая коллекция метеоров
У меня есть 2 коллекции метеоров mongo, названные приложения и ползунки. У меня есть служба, которая подписывается на них и, когда они готовы, заполняет массив в виде дерева.
проблема в том, что когда коллекция меняется, ничего не говорит сервису об этом. Поэтому, если я печатаю коллекции и массив в html, в первый раз все синхронизируется, но после изменения в коллекции меняется только коллекция.. не массив
короче говоря, когда коллекция в базе данных изменяется, обновляется коллекция метеоров, но не мой массив "section"
в моем сервисе:
var applications, sliders;
var sections = [{
name: 'Getting Started',
//state: 'home.gettingstarted',
type: 'link'
}];
$meteor.subscribe('applications').then(function(subscriptionHandle) {
applications = $meteor.collection(Applications);
}).then(function(subscriptionHandle) {
$meteor.subscribe('sliders').then(function(subscriptionHandle) {
sliders = $meteor.collection(Sliders);
createSections();
});
});
function createSections() {
//some login to create a tree
for (var i = 0; i < applications.length; i++) {
var pages = [];
for (var j = 0; j < sliders.length; j++) {
if (sliders[j].appId != applications[i].id())
continue;
var page = {};
page.name = sliders[j].nm;
page.type = "link";
page.data = sliders[j];
pages.push(page);
}
sections.push({
name: applications[i].nm,
type: 'toggle',
pages: pages,
data: applications[i]
});
}
}
контроллер в использовании сервиса. HTML зацикливает разделы.
1 ответ
Ты звонишь createSections
в обратном вызове подписки, который срабатывает только один раз при подписке .ready()
, Похоже, что вместо этого вы хотите обновлять разделы каждый раз, когда изменяется коллекция приложений. В этом случае вы можете использовать приложения. observeChanges
который срабатывает каждый раз, когда документы добавляются, изменяются или удаляются из вашей коллекции. Что-то вроде:
applications.observeChanges({
added: function(id, doc) {
// do stuff with added documents
}
});
Не забывайте, что курсоры Minimongo по умолчанию являются реактивными, если вы называете их в контексте реактивных данных, поэтому applications.find().forEach(function(doc){})
может быть достаточно для ваших целей.