KnockoutJS:计算与纯计算

meh*_*dvd 37 knockout.js knockout-3.0

KnockoutJS computed和之间的区别是什么pureComputed

我可以使用pureComputed而不是computed安全吗?

Jer*_*oen 26

它们非常相似.不同之处在于,它pureComputed具有一些性能优化,并且通过明智地了解谁在跟踪其更改来尝试防止内存泄漏.

您可以安全地替换computedpureComputed在很多的情况下.计算中的函数应遵循以下内容:

1.评估计算的可观察量不应引起任何副作用.

2.计算的可观察量的值不应根据评估的数量或其他"隐藏"信息而变化.它的值应该仅基于应用程序中其他可观察对象的值,对于纯函数定义,它们被视为其参数.

因此,作为经验法则,任何只是明确地转换某些常规observable属性的计算可观察量应该很好pureComputed,否则应该坚持使用computed.

该文档对何时/为何使用pureComputed可观察对象有不错的解释.这是一个相关的摘录:

您不应将纯特性用于计算的observable,以便在其依赖项发生更改时执行操作.

如果评估者有重要的副作用,你不应该使用纯计算机的原因很简单,只要计算器没有活动用户(并且正在休眠),评估者就不会运行.如果评估程序始终在依赖项更改时运行很重要,请使用常规计算器.

  • 基本上,如果你只需要更新订阅者(其他计算依赖于它,绑定或事件订阅者)然后使用purecomputed,如果你需要做任何其他操作,如调用ajax请求,当计算的更改的observable然后使用正常计算好像你没有活跃的订阅者计算不会刷新,如何使用if绑定例如,suscription变为非活动状态 (7认同)

joh*_*yan 21

我同意@Jeroen,我想在J. Munro的书中添加一个简短的例子,这本书给了我很多帮助,所以这对其他人也有帮助.

首先,pureComputed observable与计算的observable非常相似,具有多项性能和内存改进.该名称来自Pure函数编程术语,它意味着任何仅使用局部变量的函数都可能是纯粹的,而使用非局部变量的任何函数都可能是不纯的.

Knockout.js中的可观察对象被区别对待.因此,pureComputed observable被置于休眠模式(Knockout倾斜所有依赖关系并在读取后重新评估内容)并且计算的observable被置于监听模式(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);
Run Code Online (Sandbox Code Playgroud)

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