什么时候Template.currentData()和template.data的值不同?

Gar*_*ang 7 meteor

我知道一个是反应源,而另一个则不是.但我认为他们总能给出相同的价值.

然后我在Telescope的源代码中找到了以下代码:

    var newTerms = Template.currentData().terms; // ? reactive ?
    if (!_.isEqual(newTerms, instance.data.terms)) {
      instance.postsLimit.set(instance.data.terms.limit || Settings.get('postsPerPage', 10));
    }
Run Code Online (Sandbox Code Playgroud)

链接:https://github.com/TelescopeJS/Telescope/blob/master/packages/telescope-posts/lib/client/templates/posts_list/posts_list_controller.js#L33

所以看起来这两个值有时会有所不同.什么时候?

Syl*_*inB 8

根据Meteor的文档,关于template.data:

此属性提供对模板顶层数据上下文的访问.每次重新呈现模板时都会更新它. 访问是只读的和非反应性的.

由于我们知道当前的数据上下文是被动的,因此可以在不重新呈现模板的情况下进行更改(这使得反应在Blaze上看起来很好并且流畅),if编写此语句以检查"真实"当前术语(与我们上一次呈现当前模板时的 "之前"术语相比,存储在被动反应 中的这些Template.currentData()术语发生了变化.(存储在非反应中 template.data)

为了包装它,这个自动运行的功能是:

  1. 任何时候当前数据上下文改变......
  2. 从所述数据上下文中获取术语
  3. 将这些术语与template.data呈现模板时存储的术语进行比较
  4. 如果它们不同,则表示条款已更改(duh):重置帖子限制.