【发布时间】:2012-05-02 20:28:04
【问题描述】:
我看了docs,看了source behind reactivity,还是看不懂。
有人能解释一下这是如何在幕后工作的吗,因为这对我来说就像魔法:)。
【问题讨论】:
标签: meteor
我看了docs,看了source behind reactivity,还是看不懂。
有人能解释一下这是如何在幕后工作的吗,因为这对我来说就像魔法:)。
【问题讨论】:
标签: meteor
所以它实际上相当简单,在基本层面上涉及两种类型的功能:
创建反应式上下文的函数(反应式函数)
使反应式上下文无效的函数(使函数无效)
两者兼得的功能。 (我谎称有 3 个)
当您调用reactive function 时,它会创建一个context,该流星在全球范围内存储并且reactive function 订阅invalidation 回调。传递给响应式函数的函数或从其中运行的任何函数可以是 invalidating function,并且可以获取当前的 context 并将其存储在本地。然后,这些函数可以在任何时候(例如在数据库更新或简单的计时器调用中)使 context 无效。原始的reactive function 将接收该事件并重新评估自己。
这是使用流星函数的一步一步(注意Tracker.autorun曾经被称为Deps.autorun):
Tracker.autorun(function(){
alert("Hello " + Session.get("name"));
});
Session.set("name", "Greg");
context
context 的失效事件context 中运行。context 全局存储为当前活动的context
reactive function 也是 invalidating function
context 并在内部将其与键“名称”关联当这些函数返回时,meteor 会清理活动上下文全局变量
Session.set 是另一个能够使context 无效的函数。
contexts 无效contexts 在失效时都会运行它们的失效回调。 contexts 无效(这是 Session.get 的设计,而不是无效回调必须做的)contexts 现在运行他们的失效回调。context。整个实现实际上也相当简单,您可以在此处查看:
https://github.com/meteor/meteor/blob/master/packages/tracker/tracker.js
这里有一个很好的例子来说明它是如何工作的:
https://github.com/meteor/meteor/blob/master/packages/reactive-dict/reactive-dict.js
反应式编程实际上并不是特定于流星或 JS 的
你可以在这里阅读:http://en.wikipedia.org/wiki/Reactive_programming
【讨论】: