【问题标题】:EmberJS Computed Properties only evaluated if they are used in the template?EmberJS 计算属性仅在模板中使用时才评估?
【发布时间】:2013-08-15 18:25:21
【问题描述】:

我遇到了一个奇怪的问题,我的计算属性没有执行。经过一些测试后,我意识到对象中的其他计算属性工作正常,唯一的区别是工作的属性是在模板中渲染/使用的。

我创建了一个 JSBin 来演示。 http://jsbin.com/izoyok/16/

这两个属性具有相同的代码和行为。唯一的区别是在模板中使用了 items1ComputedProperty。请注意,计算属性正在按预期将消息记录到控制台中。

这是 ember 的要求或优化,仅在模板中重新渲染计算属性时才花时间评估计算属性?还是我犯了其他错误。

我可以理解他们是否是故意这样做的,因为有人认为不应以这种方式使用计算属性,并且您可以使用观察者为实例属性分配值,但另一方面我想很多的人不会做出同样的假设,我也没有看到任何解释这种行为的文档。

http://emberjs.com/guides/object-model/computed-properties/

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    这不是真正的模板。计算属性仅在尝试使用它们时才会执行。因此,当模板引用计算属性时,ember 会执行函数并缓存结果。然后在将来它使用缓存值,除非依赖属性之一发生了变化,在这种情况下,缓存无效,函数将再次执行。

    【讨论】:

    • 计算属性仅在尝试使用它们时才会执行。 我曾假设它们在每次修改 property() 链中的变量时执行,就像观察者一样。它是您描述的方式更优化的计算,因为不会浪费执行时间来更新不需要的计算属性。现在这一切都说得通了,而且似乎很明显,但我仍然希望有人将您的答案添加到文档中。如果人们在他们期望更新的计算属性中有日志记录或其他副作用,他们可能会遇到同样的问题。
    • 同意这将是对文档的一个很好的补充。如果你有几分钟的时间,为什么不提交 PR? github.com/emberjs/website/blob/master/source/guides/…