1

在 DDP 的介绍文章中,我读到任何东西都可以发布,但我在某处读到(例如在这个 Stackoverflow 评论中发布任意数据并自动更新 HTML)只能发布集合。

那么真相在哪里?如果我们可以发布集合以外的其他东西,我会想看一个例子,因为到目前为止我找不到。

4

2 回答 2

1

来自文档:http ://docs.meteor.com/#meteor_publish

发布函数可以返回一个 Collection.Cursor,在这种情况下 Meteor 将发布该光标的文档。您还可以返回一个 Collection.Cursors 数组,在这种情况下,Meteor 将发布所有游标。

因此,目前您只能通过光标( a 的结果Collection.find())返回 Collection。

要返回其他数据,您需要侵入 sockjs 流(meteor 用于与服务器通信的套接字库)。请注意,这并不能保证与未来版本的流星兼容。Sockjs 是用于流星在服务器(电线)之间进行通信的库

发布任意数据并自动更新 HTML *

客户端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));
     });   
}); 
于 2013-05-23T00:31:03.237 回答
1

您也可以查看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');   
  };
}
于 2013-07-01T14:01:20.543 回答