我需要通知客户有关服务器端的更改。在我的情况下,我在服务器和客户端上使用不同的集合(在这个问题中有更多关于它的信息:你将如何使用 meteor.js 构建 pinterest 之类的页面)。
在服务器上,我从外部 API 获取新产品。我想向所有客户发布新项目的数量,他们可以更新布局所需的局部变量以使其正常工作。怎么做?
如果我可以发布/订阅 Meteor.Collection 以外的其他类型的数据,那就太好了。我找到了 Meteor.deps,但据我所知,它只适用于客户端。
我需要通知客户有关服务器端的更改。在我的情况下,我在服务器和客户端上使用不同的集合(在这个问题中有更多关于它的信息:你将如何使用 meteor.js 构建 pinterest 之类的页面)。
在服务器上,我从外部 API 获取新产品。我想向所有客户发布新项目的数量,他们可以更新布局所需的局部变量以使其正常工作。怎么做?
如果我可以发布/订阅 Meteor.Collection 以外的其他类型的数据,那就太好了。我找到了 Meteor.deps,但据我所知,它只适用于客户端。
要完成您想要的,您需要另一个集合 - 在客户端。在服务器上,在发布功能中,从头开始构建一个文档,将产品的当前计数分配给一个属性。使用 observe() 并设置,修改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);
我必须说上面的解决方案向我展示了一种方法,但是,如果我需要发布到未与 observe() 连接的客户端数据怎么办?或者有任何收藏?
就我而言,我有 1000 种产品。为了吸引访问者,我通过更新随机数产品的时间戳并显示按时间戳排序的集合来“刷新”集合。多亏了这个游客有一些事情正在发生的印象。
我的refresh
方法返回产品数量(它是随机的)。我需要将该号码传递给所有客户。我做到了,但使用(我认为)丑陋的解决方法。
我的refresh
方法设置Session.set('lastRandomNo', random)
. 顺便说一句:我不知道 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
你怎么看?