看看Tracker.autorun,这主要是神奇地工作......但我想知道它是如何决定哪些变量将形成计算的依赖.它只挑选出"反应性"变量,例如:
window.bar = 1
Tracker.autorun (c) =>
bar = window.bar
foo = Session.get('foo')
console.log('autorun', foo, bar)
Run Code Online (Sandbox Code Playgroud)
如果我更改此值Session.set('foo')将导致计算再次运行.而只是改变window.bar不会导致重新运行.如果我使用订阅结果(不是集合),这也有效,所以我猜也是反应性的.
是否有任何指南可以更好地理解这种行为?
感谢下面的评论,澄清计算是可以推断的,因为访问器用于反应变量,因此流星可以跟踪deps.
但是我需要更清楚一点来理解var被标记的时间.例如,在下面的这个例子中,subscribe调用在外面autorun,但它将结果放入一个数组中.这意味着Tracker不仅跟踪对(reactive var)访问器方法的调用,而且还跟踪块中引用的任何变量 - 即使设置这些方法的调用都在autorun()块之外.
subList = [
Meteor.subscribe("Players"),
Meteor.subscribe("Stuff" )
]
Tracker.autorun (c) =>
subReady = _.filter subList, (item) ->
return item.ready()
allDone = (subList.length == subReady.length)
# this code will rerun when the subs ready() are true
Run Code Online (Sandbox Code Playgroud)
也许我应该把它添加为一个新问题......它与这个问题有关.
我不是专家,也没有多多关于它的内容,但我可以试着简单解释一下.
所有反应变量都有一个称为依赖的东西.例如,当创建新的时ReactiveVar,会创建新的依赖项.看到这里.
要从反应变量中检索值,必须调用函数.在"getter"中,指示依赖项记住它具有依赖性.例如,在这里看到的ReactiveVar.get.
要更改反应变量的值,必须调用函数.在"setter"中,依赖关系被通知某些内容已发生变化,并且表明依赖于依赖项的所有函数必须重新运行.例如,在这里看到的ReactiveVar.set.
不复杂吧?嗯,这只是一个简单的部分,现在剩下的就是建立使其工作的基础设施:)这更难解释.
反应变量本身不是反应性的; 必须在反应环境中对它们进行评估才能产生反应.通过调用创建响应环境Tracker.autorun.看到这里.
当您调用时Tracker.autorun,传递给它的函数将在新的响应环境中执行,并且环境depend将跟踪反应变量通知该方法的所有依赖项.当您调用时aDependency.depend,将执行此函数,并且它依赖于依赖项将依赖项添加到环境列表中.
当反应变量改变其值时,将执行该功能.它告诉环境它所依赖的一个反应变量已经改变,并使环境中的所有依赖项无效.发生这种情况后,Tracker.autorun将重新运行您传递给的整个函数,并将跟踪新的依赖项.
你了解大局吗?它的实现比我解释的要复杂一点,但我认为它的工作方式.
| 归档时间: |
|
| 查看次数: |
2791 次 |
| 最近记录: |