观察嵌套数组的更改不会返回添加/更改的元素

时间:2015-10-02 16:31:39

标签: javascript mongodb meteor

我在此光标上使用observeChanges,如下所示。游标包含一个名为“messages”的嵌套数组。

Connections.find({
  status: 'connected'
}).observeChanges({
  added: function (id) {
    console.log(`Connected ${id}`);
  },
  changed: function (id, fields) {
    // I expect fields to be the last array item pushed
    console.log(fields['messages']);
  }
});

然而,这会产生所有消息,而不是更改或添加的消息。你怎么能把最后的推?获取 last 一个将不会按预期工作,因为您可以一次推送多个。

Here is a fully working example on meteorpad if you want to see what I mean in action (look at console.logs)

2 个答案:

答案 0 :(得分:1)

您必须在第一步中禁用observeChanges以仅捕获新内容:

var init = true;
Connections.find({
  status: 'connected'
}).observeChanges({
  added: function (id) {
    if(init) return;
    console.log(`Connected ${id}`);
  },
  changed: function (id, fields) {
    if(init) return;
    // I expect fields to be the last array item pushed
    console.log(fields['messages']);
  }
});
init = false;

这是meteorpad版本:

http://meteorpad.com/pad/2NcJwxHYQNTqktMa5/Copy%20of%20Leaderboard

答案 1 :(得分:0)

我找到了一种方法,它只是不使用observeChanges,而是使用observe

Connections.find({
  status: 'connected'
}).observe({
  changed: function (newDoc, oldDoc) {
    let newMessages = _.clone(newDoc.messages);
    let old = _.clone(oldDoc.messages);
    while (JSON.stringify(old) !== JSON.stringify(newMessages.slice(0, old.length))) {
      old.shift();
    }
    let last = newMessages.slice(old.length);
  }
});