首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流星:反应式本地收集(仅限于客户端)正确的observeChanges

流星:反应式本地收集(仅限于客户端)正确的observeChanges
EN

Stack Overflow用户
提问于 2015-04-05 23:16:53
回答 2查看 548关注 0票数 0

我有一个包含几个数组的集合,即

代码语言:javascript
复制
memos: [...]
todos: [...]

我将每个文档从数组插入到客户机上的本地集合中:

代码语言:javascript
复制
if (Meteor.isClient) {

  this.Memos = new Mongo.Collection(null);

  var results;

  results = Projects.findOne({
    _id: currentProject_id
  });

  results.memos.forEach(function(memo) {
    return Memos.insert(memo);
  });
}

如果我调用一个方法来更改服务器集合中的备注:

代码语言:javascript
复制
({
  completeMemo: function(project_id, memo_id, ifCompleted) {
    return Projects.update({
      _id: project_id,
      'memo._id': memo_id
    }, {
      $set: {
        'memos.$.completed': ifCompleted
      }
    });
  }
});

Meteor尝试将更改后的文档重新插入本地集合,引发以下错误:

代码语言:javascript
复制
Exception from Tracker recompute function:
MinimongoError: Duplicate _id '43ttergerg33t3t'

与其重新插入文档,我只希望反映changes

我尝试过修改return Memos.insert(memo)以:

代码语言:javascript
复制
Memos.upsert({
  _id: memo._id
}, {
  $set: {
    direction: memo.direction,
    sender: memo.sender,
    sender_id: memo.sender_id,
    sentAt: memo.sentAt,
    text: memo.text,
    type: memo.type,
    viewed: memo.viewed
  }
});

但是,这会引发相同的错误。UPDATE上面的工作原理很好,错误来自于其他方面。见下面的答案。

如何观察到这些文档上的更改,只需更新已更改的字段?

我想我需要这样的东西:

代码语言:javascript
复制
Memos = new Mongo.Collection;

query = Projects.findOne({
  _id: currentProject_id
});

handle = query.memos.observeChanges({
  added: function(id, doc) {
    Memos.insert(doc);
  },

  changed: function(id, doc) {
    ..........???;
  },

  removed: function(id) {
    Memos.remove({
      _id: id
    });
  }
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-06 11:23:37

解决方案:

  1. 我将insert更改为upsert,以防止meteor尝试使用相同的_id插入新文档。
  2. Meteor不允许在客户机上替换整个文档,因此我指定了要更新的字段:
代码语言:javascript
复制
results.memos.forEach(function(memo) {
  return Memos.upsert({
    _id: memo._id
  }, {
    $set: {
      direction: memo.direction,
      sender: memo.sender,
      sender_id: memo.sender_id,
      sentAt: memo.sentAt,
      text: memo.text,
      type: memo.type,
      viewed: memo.viewed
    }
  });
});
票数 1
EN

Stack Overflow用户

发布于 2015-04-06 00:09:51

meteor尝试将更改后的文档重新插入本地集合中。

这是正常的,因为您要插入集合,这里需要的是对实际文档的更新,为此使用$set操作符

代码语言:javascript
复制
return Memos.update({_id:memo._id},{$set:{memo:memo}});

查看有关更新操作符这里的更多信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29463308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档