使用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中明确使用它们?
答案 0 :(得分:74)
如果计算的observable的唯一目的是对它进行简单绑定,那么使用函数将是等效的。绑定在计算的observable内部实现,以跟踪依赖关系,因此当任何observable发生更改时,它将重新触发绑定。
以下是有关计算可观察量与函数
的一些事项计算的observable的值被缓存,因此只有在创建它时以及更新依赖项时才会更新它。对于常规函数,您需要每次都执行逻辑。如果很多东西依赖于那个值(假设集合中的每个项目都与父项的值绑定),那么这个逻辑将一次又一次地运行。
在您的JavaScript中,您也可以像使用其他可观察对象一样自由使用计算的可观察量。这意味着您可以针对它们创建手动订阅,并从其他计算机中依赖它们(调用函数也会创建此依赖项)。您可以依赖KO中的常规实用程序方法(如ko.utils.unwrapObservable
)来一般性地确定是否需要将其作为函数调用以检索值。
如果最终要将值发送到服务器,则计算的observable将自然出现在您的JSON输出中,而正常函数的结果将在转换为JSON时消失(您可以必须做更多的工作来首先从该函数填充属性。