meh*_*dvd 37 knockout.js knockout-3.0
KnockoutJS computed和之间的区别是什么pureComputed?
我可以使用pureComputed而不是computed安全吗?
Jer*_*oen 26
它们非常相似.不同之处在于,它pureComputed具有一些性能优化,并且通过明智地了解谁在跟踪其更改来尝试防止内存泄漏.
您可以安全地替换computed用pureComputed在很多的情况下.计算中的函数应遵循以下内容:
1.评估计算的可观察量不应引起任何副作用.
2.计算的可观察量的值不应根据评估的数量或其他"隐藏"信息而变化.它的值应该仅基于应用程序中其他可观察对象的值,对于纯函数定义,它们被视为其参数.
因此,作为经验法则,任何只是明确地转换某些常规observable属性的计算可观察量应该很好pureComputed,否则应该坚持使用computed.
该文档对何时/为何不使用pureComputed可观察对象有不错的解释.这是一个相关的摘录:
您不应将纯特性用于计算的observable,以便在其依赖项发生更改时执行操作.
如果评估者有重要的副作用,你不应该使用纯计算机的原因很简单,只要计算器没有活动用户(并且正在休眠),评估者就不会运行.如果评估程序始终在依赖项更改时运行很重要,请使用常规计算器.
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.
| 归档时间: |
|
| 查看次数: |
15870 次 |
| 最近记录: |