我正在使用用户的个人资料将特定数据发布到客户端。
然而,订阅不起作用,它正在杀死我。
虽然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}});
}
如果我在Chrome的控制台行中键入Meteor.subscribe(“Lists”),它可以正常运行并且服务器正常运行。
p.s列表集合没有变化。只是发布一个不同的集合。是原因吗?
感谢您的阅读。
答案 0 :(得分:2)
如果您仔细查看subscribe的文档,可以在有关反应式计算的部分中找到此注释:
但是,如果您的run函数的下一次迭代订阅了相同的记录集(相同的名称和参数),Meteor足够聪明,可以跳过浪费的取消订阅/重新订阅。
因为你总是用相同的参数调用subscribe,meteor实际上并没有重新启动它。诀窍就是传递额外的参数来打败这个"优化"。例如:
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());
});
});
这也应该有效,但效率可能会低一些,因为只要用户的任何属性发生变化,它就会触发。
答案 1 :(得分:0)
我认为你应该在订阅之后运行“控制台日志”,并且发布方法会返回一些内容,如果你因为服务器还没有返回任何内容而无法正常工作,那么添加一个回调订阅。
Tracker.autorun( function() {
Meteor.subscribe( "List", function() {
console.log( "okok" );
// do your magic
}
};
希望它有所帮助,对不起我的英语=)