2013-02-19 2 views
0

В чем разница между следующими двумя блоками кода? Вершина работает, как и ожидалось, но ничто не делает.Meteor.deps.Context и недопустимая коллекция документов

// Initially outputs 0, but eventually outputs the # of players. 
Meteor.autorun(function() { 
    var players = Players.find(); 
    console.info(players.count()); 
}); 

// Outputs 0 twice. Why does this not work like the block above? 
var players = Players.find(); 
Meteor.autorun(function() { 
    console.info(players.count()); 
}); 

Я тестирую это в примере лидеров в блоке Meteor.isClient.

Спасибо, Эндрю

ответ

2

Хотя Метеор реактивный вам нужно сделать запрос в реактивном контексте a.k.a в Meteor.autorun. Реактивные контексты: Template, Meteor.autorun, Meteor.render и Meteor.renderList.

Во втором случае var players = Players.find(); запускается во время запуска Meteor и содержит данные, полученные во время запроса в то время, при запуске.

В первом вы разместили запрос в реактивном контексте. Который вызывается и повторяется при каждом обновлении данных. Во втором случае у него нет возможности повторить запрос, который он остается, с данными, содержащимися, когда браузер просто загрузил страницу вверх.

В то время как Meteor реагирует, вам все равно необходимо повторно запросить данные в реактивном контексте.

+0

Почему я могу делать 'var players = Players.find(); Template.leaderboard.players = function() {return players; }; 'Как шаблон повторно запрашивает данные? –

+0

Я не уверен на 100%, но я думаю, что он что-то с курсором ленив и извлекает данные в контексте шаблона, если я добавляю '.fetch()' где угодно (в 'Meteor.autorun' или начальная инструкция var также не работает в шаблоне. – Akshat

+1

Глядя на искровой код (система шаблонов метеор), похоже, что курсор сделан наблюдаемым, поэтому он работает с шаблоном, если курсор возвращается вспомогательным элементом шаблона – Akshat

Смежные вопросы