淘汰赛:计算可观察与功能

时间:2012-07-17 17:31:19

标签: knockout.js knockout-2.0 computed-observable

使用knockout时,使用只读计算的observable而不是简单的函数有什么好处?

使用以下viewmodel构造函数和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处的文档声明“...声明性绑定只是作为计算的observable实现”,这是否意味着我需要在我的viewmodels中明确使用它们?

1 个答案:

答案 0 :(得分:74)

如果计算的observable的唯一目的是对它进行简单绑定,那么使用函数将是等效的。绑定在计算的observable内部实现,以跟踪依赖关系,因此当任何observable发生更改时,它将重新触发绑定。

以下是有关计算可观察量与函数

的一些事项
  • 计算的observable的值被缓存,因此只有在创建它时以及更新依赖项时才会更新它。对于常规函数,您需要每次都执行逻辑。如果很多东西依赖于那个值(假设集合中的每个项目都与父项的值绑定),那么这个逻辑将一次又一次地运行。

  • 在您的JavaScript中,您也可以像使用其他可观察对象一样自由使用计算的可观察量。这意味着您可以针对它们创建手动订阅,并从其他计算机中依赖它们(调用函数也会创建此依赖项)。您可以依赖KO中的常规实用程序方法(如ko.utils.unwrapObservable)来一般性地确定是否需要将其作为函数调用以检索值。

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