如果有人在客户端做某事,比如
Foo.insert({blah : 1})
其中Foo
是Meteor集合,这实际上触发了一个Meteor.method调用,如 http://docs.meteor.com/#meteor_methods 的最后一段所述,它在客户端和服务器
但是,假设我定义了一个方法(在客户端和服务器上),它执行相同的操作:
Meteor.methods({
bar: function() {
Foo.insert({blah : 1})
}
});
现在,我使用
在客户端上触发此操作Meteor.call("bar");
现在,作为该方法的结果,将在客户端和服务器上调用 Foo.insert
。但是,insert
的客户端调用如何知道不再调用服务器,因为它本身就是一种方法?
此外,还有一种方法可以在客户端上调用insert
,而不会自动触发规范的服务器端延迟补偿调用并产生同步吗? (为什么我想这样做,请参阅Loading a Meteor client app with fake fire-and-forget data)
答案 0 :(得分:1)
客户端一方成为“存根”。它具有此isSimulation
属性集,使其看起来好像插入了数据以进行延迟补偿。
我认为如果在客户端上运行.method
,则始终启用延迟补偿,并且不应该在数据库中输入。因此,在客户端方法上运行的任何东西都将是“伪造”类型模拟
如果您尝试将this.isSimulation
设置为false
,您将收到一些奇怪的错误,该错误会向您显示客户端插入开始在插入时引发错误。
我不太确定如何在虚假模拟中运行它。我认为你必须在其他方法var dothis = function() {...}
类型方法中运行它。
这样做'假火'&忘记并且只有客户端数据,这是我的假设(如果我错了请更正,所以我更改了答案)修改客户端方法中的_collection
属性。
例如,如果你有
mydata = new Meteor.Collection("something");
function something() {
mydata.insert({..});
}
修改方法以执行此操作
mydata._collection.insert({..});
这将确保数据未与服务器同步,但本地集合将具有此“假数据”。
希望这有帮助!