在Meteor中,我收到了客户订阅的集合。在某些情况下,我想发送一些虚假数据,而不是发布服务器上集合中存在的文档。现在使用发布中的this.added
函数就可以了。
我的问题是我想把伪造的doc当作真实的文档,特别是当我想要更新它时会遇到麻烦。对于真实的文档,我运行RealDocs.update
但是当在虚假文档上执行此操作时它会失败,因为服务器上没有它的表示(并且我希望保持这种方式)。
一个允许我传递类似local = true
之类的东西的集合API会很棒,但我不知道实现起来有多困难,我不喜欢修改核心代码。
现在我坚持创建一个BogusDocs = new Meteor.Collection(null)
,但这使得填充集合更加困难,因为我必须在客户端代码中硬编码灯具或使用方法从服务器获取数据我必须确保在处理虚假数据时立即致电BogusDocs.update
而不是RealDocs.update
。
也许我实际上可以在服务器上插入数据并确保它稍后被删除,但数据实际上与服务器端集合无关,所以我宁愿避免这种情况。
有关如何解决此问题的任何想法?
答案 0 :(得分:19)
经过一些进一步的调查(the evented mind site)后发现可以修改本地集合而无需调用服务器。这是通过运行与通常相同的方法完成的,但是在MyCollection._collection
上而不是在Collection上。因此MyCollection.update()
将成为MyCollection._collection.update()
。因此,使用一个简单的包装器可以将通常的参数传递给更新调用以照常更新集合(它将尝试调用服务器,而服务器又将触发允许/拒绝规则),或者我们可以添加{{1} }作为仅在客户端集合中执行更新的最后一个参数。这样的事情应该做到。
'local'
(这当然可以扩展到允许插入和删除的DocsWrapper。)(但是没有尝试过这个功能,但它应该作为一个例子。)
这样做的最大好处是,我们可以使用完全相同的调用从本地集合中检索文档,无论它们是本地还是生活在服务器上。通过向doc添加一个简单的布尔值,我们可以跟踪哪些文档只是本地的,哪些不是(改进的DocsWrapper可以检查bool,所以我们甚至可以省略传递'local'参数。)所以我们知道如何更新它们。
答案 1 :(得分:0)
有些人在浏览器中处理本地存储 https://github.com/awwx/meteor-browser-store 您可以调整他们的一些想法来提供“假”文件。
答案 2 :(得分:0)
我会在集合上使用转换功能来创建一个知道如何处理自身的对象(在客户端上)。给它提供corruct更新方法(真实/伪造),然后调用.update而不是普通的。(/ p>
您可以将this.added中的代码放入转换过程中。
答案 3 :(得分: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
答案 4 :(得分:0)
也许这对你很有意思,我在meteorpad创建了两个本地Meteor Local Collections的例子。第一个pad显示了一个带有普通反应记录集的示例:Sample_Publish_to_Local-Collection。第二个将使用集合.observe
方法来收听数据:Collection.observe()。