我们使用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()函数。
有解决方法吗?
非常感谢你的帮助。
答案 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") + "!");
});