2017-02-13 10 views
0
// Works 
var counter = 0; 
    var myInterval = Meteor.setInterval(function(){ 
     counter++; 
     var time = moment().hour(0).minute(0).second(counter).format('HH:mm:ss'); 
     console.log(time); 
    }, 1000); 

// Inside Helper - Does Not Work 

Template.clockRunner.helpers({ 
    start: function() { 
    var counter = 0; 
    var time = moment().hour(0).minute(0).second(counter).format('HH:mm:ss'); 
    var myInterval = Meteor.setInterval(function(){ 
     counter++ 
    }, 1000); 
    return time; 
    }, 
}) 

Первая консоль версии регистрирует время с шагом в 1 секунду. Версия Helper отображает «00:00:00» в DOM, но не увеличивается, если я консоль регистрирую время в помощнике, он записывает «00:00:00» каждую секунду.Метеориты - DOM Манипуляция

Я не уверен, что я неправильно понимаю реактивную природу помощников или если я не вижу незначительной ошибки. Заранее спасибо!

ответ

1

помощник предназначен для предоставления данных шаблону Blaze; он не будет вызван, если не будет вызван из шаблона.

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

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

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

Последняя часть просто обеспечивает, чтобы шаблон Blaze ссылался на помощника.