可以从Meteor.autorun中排除依赖关系吗?

时间:2013-02-07 21:34:03

标签: meteor

我们使用Meteor.autorun查找“过滤器”会话变量中的更改,对服务器进行两次异步调用以获取过滤后的数据,并使用结果更新两个“列表”会话变量。在另一个.autorun函数中,脚本等待列表会话变量的更改,然后打开适用的模板。

所以,

Meteor.autorun(function(){

    set_search_session(Session.get('filters'));

    render_templates(
         Session.get('places'),
         Session.get('awards')
    );

});

var set_search_session = function(filters) {
      Meteor.call('search_places', filters.places, function(error, data) {
          Session.set('places', data);
      };
      Meteor.call('search_awards', filters.awards, function(error, data) {
          Session.set('awards', data);
      };
};

var render_templates = function(places, awards) {
      var filters = Session.get('filters');
      if (!awards && _.isUndefined(filters['neighborhood'])) {
           Session.set('template', 'place_detail');
      };
};

问题是render_templates函数运行了两次,因为它显然仍然依赖于Session.get('filters')。因此,在任何自动运行功能中,您似乎无法使用与您正在观察的更改的Session.get()函数。

有解决方法吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

更改filters来电render_templates有两个不同的原因。一个是render_templates在与Session.get('filters')相同的自动运行中被调用;另一个是render_templates本身调用Session.get('filters')

要修复前者,请将自动运行拆分为两个单独的自动运行:

Meteor.autorun(function(){
    set_search_session(Session.get('filters'));
});
Meteor.autorun(function(){
    render_templates(
         Session.get('places'),
         Session.get('awards')
    );    
});

要修复后者,可能会将“邻域”字段从Session.get('filters')移出到自己的会话字段中?

答案 1 :(得分:0)

我可能会迟到这个游戏,但我遇到了同样的问题(我需要在反应变量发生变化时修改当前用户,但不是在用户更改时,我在自动运行中使用Meteor.user() )。

答案来自“跟踪器手册”:https://github.com/meteor/meteor/wiki/Tracker-Manual#ignoring-changes-to-certain-reactive-values

Tracker.autorun(function () {
    Tracker.nonreactive(function () {
        console.log("DEBUG: current game umpire is " + game.get("umpire"));
    });
    console.log("The game score is now " + game.get("score") + "!");
});