【问题标题】:Meteor DDP: How to get notified when a NEW document is added to a CollectionMeteor DDP:如何在将新文档添加到集合时收到通知
【发布时间】:2014-08-02 07:33:13
【问题描述】:

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

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

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

【问题讨论】:

  • 这是一个反复出现的问题。这个解决方案对你有用吗? stackoverflow.com/questions/10218534/…
  • 这有点不同,因为这个问题(以及它所链接的问题)都在谈论编写直接 Meteor 代码,而不是在客户端应用程序中使用 DDP。但它可能足够接近,可以像骗子一样关闭。最重要的是,看来我需要做的是自己在自己的代码中找出区别(可能通过在新文档中包含时间戳)。我希望有一个内置的实用程序来做到这一点。
  • 我的直觉是,您应该在ready 消息到达该订阅ID 之前忽略added 的所有内容。我很确定这是触发链接^2 示例中提到的Meteor.subscribe 回调的原因。但是,我不相信这个ready 消息实际上可以保证在所有初始added 消息之后到达,这意味着这种技术可能不可靠。如果您想要一个示例,请告诉我,我会很乐意发布。我也很想知道千年发展目标的建议!

标签: javascript meteor ddp


【解决方案1】:

我花了一段时间才真正意识到,但这正是 low-level publish 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!
  });
});

更新

这是非常基本的,我实际上已经写了一个 blog post 来讨论它。

【讨论】:

  • 啊哈!这似乎正是我正在寻找的解决方案类型!我还没有机会尝试它,但我接受它,因为它显然似乎是实现此目的的预期方法。
【解决方案2】:

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

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;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多