如何将数据从服务器推送到不使用集合的所有客户端?

时间:2013-02-11 14:30:40

标签: meteor

我需要告知客户有关服务器端的更改。在我的情况下,我在服务器和客户端上使用不同的集合(在这个问题中更多关于它:how would you build pinterest like page with meteor.js)。

在服务器上,我从外部API获取新产品。我想向所有客户发布新项目的数量,他们可以更新布局运行良好所需的局部变量。 怎么做?

如果我可以发布/订阅除Meteor.Collection之外的其他类型的数据,那将是很好的。我找到了Meteor.deps,但据我所知它只适用于客户端。

2 个答案:

答案 0 :(得分:2)

要完成您想要的任务,您需要在客户端上进行另一个集合。在服务器上,在发布功能中,从头开始构建文档,将当前的Products数量分配给属性。使用observe()并设置,在从Products中添加或删除文档时修改count。订阅客户端上的count“记录集”。

// Server
Meteor.publish('count', function () {
    // Build a document from scratch
    var self = this;
    var uuid = Meteor.uuid();
    var count = Products.find().count();
    // Assign initial Products count to document attribute
    self.set('count', uuid, {count: count});

    // Observe Products for additions and removals
    var handle = Products.find().observe({
        added: function (doc, idx) {
            count++;
            self.set('counts', uuid, {count: count});
            self.flush();
        },
        removed: function (doc, idx) {
            count--;
            self.set('counts', uuid, {count: count});
            self.flush();
        }
    });
    self.complete();
    self.flush();
    self.onStop(function () {
        handle.stop();
    });
});

// Client
Counts = new Meteor.Collection('count');
Meteor.subscribe('count');
console.log('Count: ' + Counts.findOne().count);

答案 1 :(得分:0)

我必须说上面的解决方案向我展示了一种方法,但是,如果我需要发布到与observe()无关的客户端数据,该怎么办?或者任何收藏?

在我的情况下,我有1000个产品。为了吸引访问者,我通过更新随机数量的产品的时间戳,并显示按时间戳排序的集合来“刷新”该集合。感谢这位参观者的印象是发生了一些事情。

我的refresh方法返回产品数量(它是随机的)。我需要将该号码传递给所有客户。我做到了,但使用(我认为)丑陋的解决方法。

我的refresh方法设置Session.set('lastRandomNo', random)。 BTW:我不知道Session在服务器端工作。 refresh更新产品系列。

然后根据上述答案:

Meteor.publish 'refreshedProducts', ->

self = this
uuid = Meteor.uuid()

# create a new collection to pass ProductsMeta data
self.set('products_meta', uuid, { refreshedNo: 0 })

handle = Products.find().observe
  changed: (newDocument, atIndex, oldDocument) ->
    self.set('products_meta', uuid, { refreshedNo: Session.get('lastRandomNo') })
    self.flush()

self.complete()
self.flush()
self.onStop ->
  handle.stop()

在客户端:

ProductsMeta = new Meteor.Collection('products_meta')

# subscribe to server 'products_meta' collection that is generated by server
Meteor.subscribe('refreshedProducts')

ProductsMeta.find({}).observe
  changed: (newDocument, atIndex, oldDocument) ->

    # I have access to refreshedNo by
    console.log ProductsMeta.findOne().refreshedNo

您怎么看?