在 DDP 的介绍文章中,我读到任何东西都可以发布,但我在某处读到(例如在这个 Stackoverflow 评论中发布任意数据并自动更新 HTML)只能发布集合。
那么真相在哪里?如果我们可以发布集合以外的其他东西,我会想看一个例子,因为到目前为止我找不到。
在 DDP 的介绍文章中,我读到任何东西都可以发布,但我在某处读到(例如在这个 Stackoverflow 评论中发布任意数据并自动更新 HTML)只能发布集合。
那么真相在哪里?如果我们可以发布集合以外的其他东西,我会想看一个例子,因为到目前为止我找不到。
来自文档:http ://docs.meteor.com/#meteor_publish
发布函数可以返回一个 Collection.Cursor,在这种情况下 Meteor 将发布该光标的文档。您还可以返回一个 Collection.Cursors 数组,在这种情况下,Meteor 将发布所有游标。
因此,目前您只能通过光标( a 的结果Collection.find()
)返回 Collection。
要返回其他数据,您需要侵入 sockjs 流(meteor 用于与服务器通信的套接字库)。请注意,这并不能保证与未来版本的流星兼容。Sockjs 是用于流星在服务器(电线)之间进行通信的库
客户端js
sc = new Meteor._Stream('/sockjs');
sc.on('message', function(payload) {
var msg = JSON.parse(payload);
Session.set('a_random_message', JSON.stringify(msg.data));
});
Template.hello.greeting = function () {
return Session.get('a_random_message');
};
服务器端js
ss = new Meteor._StreamServer();
ss.register(function (socket) {
var data = {socket: socket.id, connected: new Date()}
var msg = {msg: 'data', data: data};
// Send message to all sockets (which will be set in the Session a_random_message of the client
_.each(ss.all_sockets(), function(socket) {
socket.send(JSON.stringify(msg));
});
});
您也可以查看Meteor Streams。见下文。
假设您已经通过大气添加了流星流 -
mrt add streams
sc = new Meteor.Stream('hello');
if(Meteor.isServer) {
Meteor.setInterval(function() {
sc.emit('a_random_message', 'Random Message: ' + Random.id());
}, 2000);
Meteor.permissions.read(function() { return true });
}
if(Meteor.isClient) {
sc.on('a_random_message', function(message) {
Session.set('a_random_message', message);
});
Template.hello.greeting = function () {
return Session.get('a_random_message');
};
}