淘汰赛:计算观察到VS功能

问题描述:

当使用淘汰赛,什么是使用只读观测计算,而不是简单的功能的优势呢?淘汰赛:计算观察到VS功能

看看下面的视图模型构造和HTML片段,例如:这里

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

似乎一切都如你所期望的工作,所以是有原因,我应该使用:

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

我注意到,在http://knockoutjs.com/documentation/computedObservables.html文档指出“......声明绑定简单地计算观测实施”,这是否意味着有需要我在我的ViewModels明确地使用它们?

如果你的计算观察到的唯一目的是做一个简单的绑定反对它,然后使用功能将是等效的。绑定在计算的observable内部实现以跟踪依赖关系,因此当任何可观察对象发生更改时,绑定都会重新触发绑定。

下面是要考虑有关计算观测与功能

  • 的一个计算观察到的缓存值的几件事情,所以创建,并在依赖被更新时,它才会更新。对于常规函数,每次都需要执行逻辑。如果很多事情都依赖于这个值(比如说集合中的每个项目都与来自父项的值绑定),那么这个逻辑将会一次又一次地运行。

  • 在JavaScript中,您也可以免费使用计算观测就像使用其他观测。这意味着您可以针对它们创建手动订阅,并依赖其他计算机(调用函数也会创建此依赖性)。你可以依靠KO正常实用方法,如ko.utils.unwrapObservable一般地确定是否需要将其作为调用一个函数或不检索值。

  • 如果您最终想要将值发送到服务器,则计算出的observable将自然出现在您的JSON输出中,而正常函数的结果值在转换为JSON时会消失(您会有首先做更多的工作来填充该功能的属性)。

+0

大回答:谢谢! – Duncan 2012-07-17 19:04:31

+1

很好的答案。当我想要每次执行完整的逻辑时,我有时会使用函数而不是计算。 – 2012-07-17 22:06:22

+1

它是如何知道一个计算的观察值取决于另一个可观察值,当我通过它时是一个函数?它是否解析该功能!? - 时间来读取淘汰赛的源代码我猜 – zod 2013-10-10 15:06:17