1

我们正在使用 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() 功能。

有没有解决的办法?

非常感谢您的帮助。

4

2 回答 2

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')它自己的会话字段?

于 2013-02-07T21:46:09.590 回答
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") + "!");
});
于 2015-08-28T16:06:06.097 回答