Javascript Meteor DDP:如何在向集合中添加新文档时获得通知

Javascript Meteor DDP:如何在向集合中添加新文档时获得通知,javascript,meteor,ddp,Javascript,Meteor,Ddp,我正在编写一个软件,通过DDP连接到Meteor服务器以读取数据 我面临的问题是如何区分添加到集合中的新文档和已存在文档的通知。 当我第一次连接到服务器时,我会收到一系列添加的消息来填充clientside集合。我不知道如何区分这些消息和稍后出现的消息,它们表明新文档已实时添加。当DDP客户端需要重新连接到服务器时,情况会变得更糟,此时所有当前文档都会再次作为添加的消息发送。我过去遇到过此问题,并找到了解决方案。在第一次渲染时设置变量,并在初始观察后更改变量-示例: var initializi

我正在编写一个软件,通过DDP连接到Meteor服务器以读取数据

我面临的问题是如何区分添加到集合中的新文档和已存在文档的通知。


当我第一次连接到服务器时,我会收到一系列添加的
消息来填充clientside集合。我不知道如何区分这些消息和稍后出现的消息,它们表明新文档已实时添加。当DDP客户端需要重新连接到服务器时,情况会变得更糟,此时所有当前文档都会再次作为添加的消息发送。

我过去遇到过此问题,并找到了解决方案。在第一次渲染时设置变量,并在初始观察后更改变量-示例:

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;

我花了一段时间才真正意识到,但这正是这款手机的设计初衷。向下阅读“或者,发布功能可以…”一节,您应该非常清楚如何只发送
添加的
消息以获取真正的新文档。或者提供一个简单的例子:

服务器和客户端:

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!
  });
});
更新


这是一个非常基本的问题,我已经写了一篇关于它的文章。

这是一个反复出现的问题。这个解决方案对你有用吗?这有点不同,因为这个问题(以及它链接到的问题)都是关于编写直接Meteor代码,而不是在客户端应用程序中使用DDP。但它可能已经足够接近被愚弄了。归根结底,我需要做的似乎是自己在自己的代码中找出区别(可能通过在新文档中包含时间戳)。我希望有一个内置的实用程序来做这件事。我的直觉是,在订阅id的
ready
消息到达之前,你应该忽略
添加的所有内容。我很确定这就是触发链接^2示例中提到的
Meteor.subscribe
回调的原因。然而,我不相信这个
ready
消息实际上保证在所有初始
添加的
消息之后到达,这意味着这种技术可能不可靠。请让我知道,如果你想一个例子,我会很高兴地张贴。我也想知道千年发展目标有什么建议!啊哈!这似乎正是我一直在寻找的解决方案!我还没有机会尝试它,但我接受了它,因为它显然是实现这一点的预期方法。实际上,该函数称为“observeChanges”,它的工作原理如下