当反应变量改变值时,为什么不运行此函数?

时间:2015-07-23 23:32:18

标签: javascript templates meteor reactive-programming

我是流星的新手,我试图了解整个反应性的事情。

没有特定原因我希望此函数重新运行,事实上,它不重新运行实际上是我的用例所需的行为。我只是想知道为什么会这样,所以我可以更好地理解这些概念。

如果我在模板实例上添加一个函数作为属性,如下所示:

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

然后我更新反应性var以响应某些事件。

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()];
    }
});

为什么会这样?

1 个答案:

答案 0 :(得分:2)

反应数据源仅导致某些功能自动重新运行。这些功能是:

  • Tracker.autorun
  • Template.myTemplate.helpers({})
  • Blaze.renderBlaze.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());
        };
    });
});