[英]Meteor, communication between the client and the server
这是待办事项列表教程的摘录。 在客户端和服务器端都表示checked
变量? 客户端和服务器如何通信以使checked
一致?
Template.task.events({
'click .toggle-checked'() {
// Set the checked property to the opposite of its current value
Tasks.update(this._id, {
$set: { checked: ! this.checked },
});
},
'click .delete'() {
Tasks.remove(this._id);
},
});
checked
是在Tasks
对象上定义的属性,如此应用程序中所定义。
在Meteor中,此对象的确定记录存储在服务器上(在MongoDB
),但是这里有一个也在操作的客户端缓存,称为MiniMongo
。 流星框架在后台(通过DDP
协议)做了很多工作,以使服务器和客户端对象保持同步。
在这种情况下,当用户单击Tasks.update
方法中的复选框(触发'click .toggle-checked'
事件代码)时,会发生以下情况:
Optimistic UI
,并使客户端UI能够快速响应(无需等待服务器) clicked
变量设置为新值,向服务器发送一条消息( Meteor Method
),该消息是客户端要更新Tasks
对象。 Tasks
对象的MongoDB
版本,或者拒绝适当处理更新。 Tasks
对象的结果状态的DDP
更新。 DDP
更新,并将其MiniMongo
版本替换为服务器的Tasks
对象版本,以确保所有客户端都与服务器同步。 现在,在理想情况下,当服务器接受客户端更改时,启动客户端接收到的新版本Tasks
(在步骤5中)将与乐观地更新的对象(在步骤1中)匹配。
但是,通过执行所有这些步骤,Meteor框架还可以同步其他客户端,并在服务器拒绝更新或可能修改其他字段(适用于该应用程序)时处理这种情况。
幸运的是,这都是由Meteor框架处理的,您所需要做的就是调用Tasks.update
以使所有这些魔术发生!
流星喜欢模糊客户端和服务器之间的界限。 您可以执行某些操作来抽象代码-例如,在/server
目录中的javascript文件(在所有文件中)以限制对其的访问。 这意味着客户端用户看不到此代码。
/client
显然是相反的。 您可以使用isClient
和isServer
检查文件。
现在,这对您的代码意味着什么?
根据您的代码的位置,有不同的访问级别。 但是,在脚本内部,基本上没有区别。 在该脚本内的服务器/客户端上,被checked
是已知的,因为这是Meteor的运行方式,客户端和服务器之间的模糊线使这成为可能。
流星使用了一种称为“无处不在的数据库”的东西,这意味着在哪里调用代码都没有关系,因为它将运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.