【问题标题】:KnockoutJS: computed vs. pureComputedKnockoutJS:计算与纯计算
【发布时间】:2015-07-30 18:27:53
【问题描述】:

KnockoutJS 中的computedpureComputed 有什么区别?

我可以安全地使用pureComputed 代替computed 吗?

【问题讨论】:

  • @Luis 我不明白为什么我们不应该在计算中有操作时使用pureComputed
  • 你应该阅读文档,然后询问你不理解的部分文档,事实上,你似乎是在要求人们为你阅读它们并给你一个 tldr
  • 简而言之,直到有人请求 pure computed value 查看或 vm pureComputed 将在 sleep mode 中,它不会随时评估。 exjsfiddle.net/rahulrulez/jg0s1xhb/5/light 你可以在小提琴中看到,直到满足 <!--ko if: step() == 2--> 条件 pureComputed 不会触发(是什么让 pureComputed 触发呢?如前所述,if 条件内的 html 内容被渲染,我们有一个带有数据绑定的元素请求 pureComputed 值)#hopeThatHelpsSomeone

标签: knockout.js knockout-3.0


【解决方案1】:

它们非常相似。 The difference is 表示 pureComputed 进行了一些性能优化,并试图通过了解谁在跟踪其更改来防止内存泄漏。

在很多情况下,您可以放心地将computed 替换为pureComputed。计算出的should follow this里面的函数:

1. 评估计算的 observable 不会产生任何副作用。

2. 计算出的 observable 的值不应根据评估次数或其他“隐藏”信息而变化。它的值应该完全基于应用程序中其他可观察对象的值,对于纯函数定义,这些值被视为它的参数。

所以根据经验,任何计算出的 observable 只是简单地转换一些常规的 observable 属性应该可以作为 pureComputed,否则坚持使用 computed

The documentation has decent explanations 什么时候/为什么你应该使用pureComputed observables。以下是相关摘录:

您不应该将纯功能用于计算的可观察对象,该可观察对象旨在在其依赖关系发生变化时执行操作。

如果评估器具有重要的副作用,则不应使用纯计算器的原因很简单,只要计算器没有活动订阅者(睡眠也是如此),评估器就不会运行。如果评估器在依赖关系发生变化时始终运行很重要,请改用常规计算。

【讨论】:

  • 我不明白为什么当计算中有动作时我们不应该使用pureComputed。
  • 不要认为我能比文档更好地解释它。我在您的评论中添加了一些与该问题相关的引用,但对于更多问题/详细信息,我建议您仔细阅读文档。如果在那之后您仍然有疑问,那么实际的源代码以及试验可能是比在这里询问更可行的选择。
  • 基本上,如果您只需要更新订阅者(其他计算依赖于它、绑定或事件订阅者)然后使用纯计算,如果您需要执行任何其他操作,例如在可观察对象时调用 ajax 请求对于该计算更改,然后使用普通计算,就好像您没有活动订阅者一样,计算不会刷新,订阅如何变为非活动状态,例如使用 if 绑定
  • @Luis 谢谢 luis.... 需要像您刚刚提供的更清晰的示例,否则在计算与纯计算方面,互联网正在成为抽象的方式
  • @Luis 但听起来如果您将计算直接绑定到页面的 DOM(或者在某些情况下您有“永久”订阅者),两者之间没有实际区别.对吗?
【解决方案2】:

我同意@Jeroen 的观点,我想添加一个来自 J. Munro 的 book 的简短示例,这对我有很大帮助,因此这也可能对其他人有所帮助。

首先,pureComputed observables 与计算后的 observables 非常相似,但在性能和内存方面都有一些改进。该名称是从Pure function 编程术语中借用的,它意味着任何仅使用局部变量的函数都可能是纯函数,而任何使用非局部变量的函数都可能是不纯的。

Knockout.js 中的 observables 被区别对待。因此,pureComputed observables 被置于睡眠模式(Knockout 倾斜所有依赖项并在读取后重新评估内容),并且计算出的 observables 被置于监听模式(Knockout 在第一次访问之前不断检查值是否是最新的) .

因此,如果您需要执行其他代码,那么最好使用计算的 observables。

function ViewModel() {
     var self = this;

     self.firstName = ko.observable('Arshile');
     self.lastName = ko.observable('Gorky');
     self.pureComputedExecutions = 0;
     self.computedExecutions = 0;

     self.pureComputedFullName = ko.pureComputed(function() {
         // This is NOT recommended 
         self.pureComputedExecutions++;
         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
     self.computedFullName = ko.computed(function() {
         self.computedExecutions++;

         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
 };
 var viewModel = new ViewModel();
 ko.applyBindings(viewModel);

 alert('Pure computed executions: ' + viewModel.pureComputedExecutions);
 alert('Computed executions: ' + viewModel.computedExecutions);

运行此代码时,会显示两条警告消息,显示调用 pureComputed 和 computed 函数的次数。由于 pureComputed 处于睡眠模式,因此从未访问过该函数,并且计数器将显示 0。与此相反,计算函数在数据绑定时自动评估,导致计数器增加数字并显示 1。

【讨论】:

  • “倾斜所有依赖项”是什么意思?
  • 存储依赖关系并稍后检查它们
猜你喜欢
  • 2012-10-11
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2013-02-18
  • 2012-11-24
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多