2017-01-25 221 views
0

这从待办事项列表教程片段之间的通信。变量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); 
    }, 
}); 

回答

-2

流星喜欢模糊客户端和服务器之间的界限。有些东西可以用来抽象代码 - 例如,/server目录中的javascript文件(包括所有文件)以限制对其的访问。这意味着客户端用户无法看到此代码。

/client显然是相反的。您可以使用isClientisServer检查文件。

现在,这是什么意思你的代码?

根据您的代码,也有不同的访问级别。但是,在脚本内部,基本没有区别。 checked在该脚本中的服务器/客户端上是已知的,因为这就是Meteor运行的方式,客户端和服务器之间的模糊线路使这成为可能。

流星采用了名为“数据库无处不在”,这意味着它并不重要,其中的代码被调用,因为它会运行。

0

checkedTasks对象上定义一个attrubite,如在此应用中所定义。

在Meteor中,此对象的最终记录存储在服务器上(位于MongoDB),但是此处也有一个客户端缓存,此处也称为MiniMongo。 Meteor框架在后台做了很多工作(通过DDP协议),以保持服务器和客户端的对象保持同步。

在这种情况下,下面当用户点击复选框在Tasks.update方法(焙烧'click .toggle-checked'事件代码)正在发生的事情:

  1. 首先更新客户端侧MiniMongo缓存 - 这被称为Optimistic UI,和使客户端UI能够快速响应(无需等待服务器)
  2. 通过将clicked变量设置为新值,向服务器发送消息(Meteor Method),表明客户端想要更新Tasks对象。
  3. 消息请求更新通过服务器接收,检查这是一个有效的操作,并且或者对其进行处理(更新MongoDB版本Tasks对象的,或拒绝处理更新为适当。
  4. 服务器将发出一个DDP更新的Tasks对象到所有客户端所产生的状态已经预订,包括它的发布。先前已订阅将收到此DDP更新
  5. 客户,并将与服务器的的Tasks对象的版本替换其MiniMongo版本,确保所有客户端与服务器同步

现在,在理想的情况下,当服务器接受客户端的变化,Tasks接收到的新版本(在步骤5)由所述发起客户端将匹配它乐观地更新该对象(步骤1)。

但是通过实施这些步骤的流星框架也同步其他客户端,并在服务器拒绝更新,或可能修改其他字段,以适合的应用程序处理的情况。

幸运的是,虽然,这是全部由流星框架处理,所有你需要做的就是调用Tasks.update这一切神奇的发生!