Meteor.subscribe 被跳过,在 Tracker.autorun 中不起作用
Meteor.subscribe is skipped, doesn’t work in Tracker.autorun
我正在使用用户的个人资料向客户发布特定数据。
但是订阅不起作用,我快死了。
尽管 Tracker.autorun() 运行,服务器没有 运行 任何发布。
Tracker.autorun(function () {
console.log(‘autorun is running');
console.log(Meteor.user()) //to be reactive to user's update
Meteor.subscribe(“Lists”,{
onStop:function() {
console.log('subscribe call back onStop');
},
onReady: function(){
console.log('subscribe call back onReady');
});
console.log(Lists.find().count());
}
Meteor.publish('Lists', function(){
console.log('publish is running’);
var list = Meteor.users.findOne({_id: this.userId}).list;
return Lists.find({_id: {$in: list}});
}
p.s 如果我在 Chrome 的控制台行中键入 Meteor.subscribe(“Lists”),它会工作并且服务器 运行 正常发布。
p.s Lists 集合没有改变。只是发布不同的集合。是这个原因吗?
感谢您的阅读。
我认为你应该 运行 "console log" 在订阅和发布方法之后 return 一些东西,如果你立即做一些事情是不应该工作的,因为服务器不是 return正在执行任何操作,向订阅添加回调。
Tracker.autorun( function() {
Meteor.subscribe( "List", function() {
console.log( "okok" );
// do your magic
}
};
希望对你有帮助,抱歉我的英语不好=)
如果您仔细查看 subscribe 的文档,您会在有关反应式计算的部分中找到此注释:
However, if the next iteration of your run function subscribes to the same record set (same name and parameters), Meteor is smart enough to skip a wasteful unsubscribe/resubscribe.
所以因为您总是使用相同的参数调用订阅,所以 meteor 实际上并没有重新启动它。诀窍就是传递额外的参数来击败这个"optimization"。例如:
Tracker.autorun(function() {
var user = Meteor.user();
var list = user && user.list;
if (!_.isEmpty(list)) {
Meteor.subscribe('Lists', list, function() {
console.log(Lists.find().count());
});
}
});
这里我们从用户中提取 list
变量(假设它已发布)并将其用作额外参数以强制重新运行订阅。如果未发布,您可以使用这样的随机 ID:
Tracker.autorun(function() {
var user = Meteor.user();
Meteor.subscribe('Lists', Random.id(), function() {
console.log(Lists.find().count());
});
});
这应该也可以,但效率可能会低一些,因为只要 any 属性 用户发生变化,它就会触发。
我正在使用用户的个人资料向客户发布特定数据。
但是订阅不起作用,我快死了。
尽管 Tracker.autorun() 运行,服务器没有 运行 任何发布。
Tracker.autorun(function () {
console.log(‘autorun is running');
console.log(Meteor.user()) //to be reactive to user's update
Meteor.subscribe(“Lists”,{
onStop:function() {
console.log('subscribe call back onStop');
},
onReady: function(){
console.log('subscribe call back onReady');
});
console.log(Lists.find().count());
}
Meteor.publish('Lists', function(){
console.log('publish is running’);
var list = Meteor.users.findOne({_id: this.userId}).list;
return Lists.find({_id: {$in: list}});
}
p.s 如果我在 Chrome 的控制台行中键入 Meteor.subscribe(“Lists”),它会工作并且服务器 运行 正常发布。
p.s Lists 集合没有改变。只是发布不同的集合。是这个原因吗?
感谢您的阅读。
我认为你应该 运行 "console log" 在订阅和发布方法之后 return 一些东西,如果你立即做一些事情是不应该工作的,因为服务器不是 return正在执行任何操作,向订阅添加回调。
Tracker.autorun( function() {
Meteor.subscribe( "List", function() {
console.log( "okok" );
// do your magic
}
};
希望对你有帮助,抱歉我的英语不好=)
如果您仔细查看 subscribe 的文档,您会在有关反应式计算的部分中找到此注释:
However, if the next iteration of your run function subscribes to the same record set (same name and parameters), Meteor is smart enough to skip a wasteful unsubscribe/resubscribe.
所以因为您总是使用相同的参数调用订阅,所以 meteor 实际上并没有重新启动它。诀窍就是传递额外的参数来击败这个"optimization"。例如:
Tracker.autorun(function() {
var user = Meteor.user();
var list = user && user.list;
if (!_.isEmpty(list)) {
Meteor.subscribe('Lists', list, function() {
console.log(Lists.find().count());
});
}
});
这里我们从用户中提取 list
变量(假设它已发布)并将其用作额外参数以强制重新运行订阅。如果未发布,您可以使用这样的随机 ID:
Tracker.autorun(function() {
var user = Meteor.user();
Meteor.subscribe('Lists', Random.id(), function() {
console.log(Lists.find().count());
});
});
这应该也可以,但效率可能会低一些,因为只要 any 属性 用户发生变化,它就会触发。