2015-07-23 3 views
0

Я новичок в метеор, и я пытаюсь повесить всю реакционную вещь.Почему эта функция не работает, когда реактивная переменная меняет значение?

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

Если добавить функцию в качестве свойства на экземпляре шаблона, например:

Template.services.onCreated(function() { 
    this.templates = [ 
     "web_design", 
     "painting", 
     "gardening" 
    ]; 
    this.current_index = new ReactiveVar(0); 

    this.determineSlideDirection = function() { 
     console.log(this.current_index.get()); 
    }; 
}); 

А потом я обновляю реактивный вар в ответ на какое-то событие.

Template.services.events({ 
    'click .nav-slider .slider-item': function(event, template) { 
     var new_selection = event.currentTarget; 
     template.current_index.set($(new_selection).index()); 
    } 
}); 

Функция не повторно запустить на вызове set() вызова.

Однако, если у меня есть помощник , который использует переменную, он будет повторно запущен.

Template.services.helpers({ 
    currentTemplate: function() { 
     var self = Template.instance(); 
     return self.templates[self.current_index.get()]; 
    } 
}); 

Почему это?

ответ

2

Реактивные источники данных приводят к тому, что некоторые функции автоматически перезапускаются. Эти функции являются:

  • Tracker.autorun
  • Template.myTemplate.helpers({})
  • Blaze.render и Blaze.renderWithData

В коде выше вы хотели бы использовать Tracker.autorun

Template.services.onCreated(function() { 
    this.templates = [ 
     "web_design", 
     "painting", 
     "gardening" 
    ]; 

    this.current_index = new ReactiveVar(0); 

    Tracker.autorun(function(){ 
     // actually, this might not work because the context of 
     // 'this' might be changed when inside of Tracker. 
     this.determineSlideDirection = function() { 
      console.log(this.current_index.get()); 
     }; 
    }); 
}); 
+3

'Tracker.autorun' также обычно тупик как «Tracker.autofun», потому что он дает лет u автоматическое FUN! – fuzzybabybunny

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