Tracker.autorun如何选择计算?

dcs*_*san 4 meteor

看看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)

也许我应该把它添加为一个新问题......它与这个问题有关.

Pep*_*L-G 5

我不是专家,也没有多多关于它的内容,但我可以试着简单解释一下.


所有反应变量都有一个称为依赖的东西.例如,当创建新的时ReactiveVar,会创建新的依赖项.看到这里.

要从反应变量中检索值,必须调用函数.在"getter"中,指示依赖项记住它具有依赖性.例如,在这里看到ReactiveVar.get.

要更改反应变量的值,必须调用函数.在"setter"中,依赖关系被通知某些内容已发生变化,并且表明依赖于依赖项的所有函数必须重新运行.例如,在这里看到ReactiveVar.set.


不复杂吧?嗯,这只是一个简单的部分,现在剩下的就是建立使其工作的基础设施:)这更难解释.

反应变量本身不是反应性的; 必须在反应环境中对它们进行评估才能产生反应.通过调用创建响应环境Tracker.autorun.看到这里.

当您调用时Tracker.autorun,传递给它的函数将在新的响应环境中执行,并且环境depend将跟踪反应变量通知该方法的所有依赖项.当您调用时aDependency.depend,将执行此函数,并且它依赖于依赖项将依赖项添加到环境列表中.

当反应变量改变其值时,将执行该功能.它告诉环境它所依赖的一个反应变量已经改变,并使环境中的所有依赖项无效.发生这种情况后,Tracker.autorun将重新运行您传递给的整个函数,并将跟踪新的依赖项.

你了解大局吗?它的实现比我解释的要复杂一点,但我认为它的工作方式.