我正在编写一个通过 DDP 连接到 Meteor 服务器以读取数据的软件。
我面临的问题是弄清楚如何区分添加到集合中的新文档和收到有关已存在文档的通知。
当我第一次连接到服务器时,我会收到一系列added
消息来填充客户端集合。我不知道如何区分这些消息和后来的消息,表明新文档已实时添加。当 DDP 客户端需要重新连接到服务器时,情况会变得更糟,此时所有当前文档都会再次作为added
消息发送。
我正在编写一个通过 DDP 连接到 Meteor 服务器以读取数据的软件。
我面临的问题是弄清楚如何区分添加到集合中的新文档和收到有关已存在文档的通知。
当我第一次连接到服务器时,我会收到一系列added
消息来填充客户端集合。我不知道如何区分这些消息和后来的消息,表明新文档已实时添加。当 DDP 客户端需要重新连接到服务器时,情况会变得更糟,此时所有当前文档都会再次作为added
消息发送。
我花了一段时间才真正意识到,但这正是低级发布 API的设计目的。向下阅读“或者,发布功能可以...”部分,应该很清楚如何只added
为真正的新文档发送消息。或者提供一个简单的例子:
服务器和客户端:
MyData = new Meteor.Collection("mydata");
客户:
Meteor.subscribe('myPub', myFilter);
服务器:
Meteor.publish('myPub', function(filter) {
var self = this;
var initializing = true;
var handle = MyData.find(filter).observeChanges({
added: function (id, fields) {
if (!initializing)
self.added("mydata", id, fields);
},
changed: function(id, fields) {
self.changed("mydata", id, fields);
},
removed: function (id) {
self.removed("mydata", id);
}
});
initializing = false;
self.ready();
self.onStop(function () {
handle.stop(); // v. important to stop the observer when the subscription is stopped to avoid it running forever!
});
});
更新
这是非常基本的,我实际上已经写了一篇关于它的博客文章。
我过去遇到过这个问题并找到了解决方案。在第一次渲染时设置一个变量,并在初始观察后更改变量 - 示例:
var initializing = true;
var handle = Collection.find().observe({
added: function (item) {
if (!initializing)
// do stuff with newly added items, this check skips the first run
}
});
initializing = false;