流星DDP:当一个新文档被添加到集合中时,如何获得通知

Meteor DDP: How to get notified when a NEW document is added to a Collection

本文关键字:添加 集合 通知 何获得 DDP 流星 新文档 一个 文档      更新时间:2023-09-26

我正在编写一个通过DDP连接到流星服务器读取数据的软件。

我面临的问题是弄清楚如何区分添加到集合中的新文档和获得关于已经存在的文档的通知。

当我第一次连接到服务器时,我得到一系列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;