我正在尝试创建一个Meteor应用程序,用于在Meteor集合中存储要在服务器和客户端之间传递的内容,以便在通过twit包进行异步api调用后显示成功消息。
但是,我遇到了一个问题,当我更新服务器上的集合并且更新没有反映在客户端上时。我的代码如下:
/ lib中
Alerts = new Meteor.Collection("alerts");
/客户端
Template.suggestionForm.events({
"submit form": function (e) {
return Meteor.call('submitMessage', message);
}
});
Meteor.subscribe('alerts');
Meteor.startup(function() {
Tracker.autorun(function() {
console.log(Alerts.find());
})
});
/服务器
Fiber = Npm.require('fibers')
Twit = new TwitMaker({
consumer_key: '...',
consumer_secret: '...',
access_token: '...',
access_token_secret: '...'
});
Meteor.publish("alerts", function(){
Alerts.find();
});
Meteor.methods({
submitMessage: function(message) {
this.unblock();
Twit.post('statuses/update', { 'status': message }, function(err, data, response) {
Fiber(
Alerts.remove({});
Alerts.insert({response: err});
).run();
}));
}
});
当我提交表单时,函数调用很好并更新集合,但是Tracker.autorun()不会运行。任何想法为什么会发生这种情况或者如何让客户端监听集合中的变化都会非常有帮助。谢谢!
答案 0 :(得分:1)
请记住在publish()中返回结果光标:
Meteor.publish("alerts", function(){
return Alerts.find();
});
参考:http://docs.meteor.com/#/full/meteor_publish
发布功能可以返回Collection.Cursor,在这种情况下,Meteor会将该光标的文档发布到每个订阅的客户端。您还可以返回一组Collection.Cursors,在这种情况下,Meteor将发布所有游标。
和
或者,发布函数可以通过调用添加的函数(将新文档添加到已发布的记录集),更改(更改或清除已发布记录集中已有文档的某些字段)来直接控制其已发布的记录集),并删除(从已发布的记录集中删除文档)。这些方法由您的发布功能提供。
如果发布函数没有返回游标或游标数组,则假定它使用低级别添加/更改/删除的接口,并且一旦初始记录集完成,它也必须调用就绪。