9

在 Meteor 中,我得到了一个客户订阅的集合。在某些情况下,我不想在服务器上发布集合中存在的文档,而是想发送一些虚假数据。现在可以使用this.added发布中的功能了。

我的问题是我想将伪造的文档视为真实文档,特别是当我想更新它时会很麻烦。对于真正的文档,我运行 aRealDocs.update但是在伪造文档上执行此操作时失败,因为服务器上没有它的表示(我想保持这种方式)。

一个允许我通过这样的东西的集合 APIlocal = true会很棒,但我不知道实现起来有多么困难,而且我不喜欢修改核心代码。

现在我被困在创建一个BogusDocs = new Meteor.Collection(null)但是这使得填充集合更加困难,因为我必须在客户端代码中硬编码固定装置或使用一种方法从服务器获取数据,我必须确保我BogusDocs.update改为调用RealDocs.update一旦我处理虚假数据。

也许我实际上可以在服务器上插入数据并确保稍后将其删除,但数据实际上与服务器端收集无关,所以我宁愿避免这种情况。

关于如何解决这个问题的任何想法?

4

5 回答 5

20

经过一些进一步的调查(事件的头脑站点)事实证明,可以修改本地集合而无需调用服务器。这是通过运行与通常相同的方法来完成的,但在MyCollection._collection而不是仅在 Collection 上运行。MyCollection.update()将因此成为MyCollection._collection.update(). 因此,使用简单的包装器可以将常用参数传递给更新调用,以照常更新集合(这将尝试调用服务器,这反过来会触发您的允许/拒绝规则),或者我们可以添加'local'作为最后一个参数仅在客户端集合中执行更新。像这样的事情应该这样做。

DocsUpdateWrapper = function() {
  var lastIndex = arguments.length -1;
  if (arguments[lastIndex] === 'local') {
    Docs._collection.update(arguments.slice(0, lastIndex);
  } else {
    Docs.update(arguments)
  }
}

(这当然可以扩展到允许插入和删除的 DocsWrapper。)(还没有尝试过这个功能,但它应该可以很好地作为一个例子。)

这样做的最大好处是,我们可以使用完全相同的调用从本地集合中检索文档,无论它们是本地的还是也位于服务器上。通过向文档添加一个简单的布尔值,我们可以跟踪哪些文档仅是本地的,哪些不是(改进的 DocsWrapper 可以检查该布尔值,因此我们甚至可以省略传递“本地”参数。)所以我们知道如何更新他们。

于 2013-09-14T13:15:50.973 回答
0

也许这对您来说也很有趣,我在meteorpad 创建了两个带有本地Meteor Local Collections 的示例。第一个 pad 显示了一个带有普通反应记录集的示例:Sample_Publish_to_Local-Collection。第二个将使用 collection.observe方法来监听数据:Collection.observe()

于 2015-04-30T18:30:02.953 回答
0

我会使用集合上的转换功能来制作一个知道如何处理自己的对象(在客户端)。给它正确的更新方法(真实/虚假),然后调用 .update 而不是一般的。

您可以将 this.add 中的代码放入转换过程中。

于 2013-09-13T18:09:08.563 回答
0

有些人在浏览器中处理本地存储 https://github.com/awwx/meteor-browser-store 您也许可以调整他们的一些想法以提供“假”文档。

于 2013-09-13T16:59:16.590 回答
0

您还可以设置本地 minimongo 集合。插入回调

@FoundAgents = new Meteor.Collection(null, Agent.transformData )

  FoundAgents.remove({})
  Meteor.call 'Get_agentsCloseToOffer', me, ping, (err, data) ->
    if err
      console.log JSON.stringify err,null,2
    else
      _.each data, (item) ->
        FoundAgents.insert  item
于 2013-09-13T19:57:14.410 回答