淘汰赛:计算可观察vsfunction

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

以下面的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的文档声明“…声明性绑定只是作为计算的observables实现”,所以这意味着我需要明确地在我的视图模型中使用它们?

如果您的计算观察值的唯一目的是对它进行简单的绑定,那么使用函数将是等价的。 绑定是在一个被计算的observable内部实现的,用来跟踪依赖关系,所以当任何可观察对象发生变化时,绑定都会重新触发绑定。

这里有一些事情要考虑计算可观察与function

  • 所计算的observable的值被高速caching,所以只有在创build和更新依赖时才会更新。 对于常规函数,您需要每次执行逻辑。 如果很多东西都依赖于这个值(比如说集合中的每个项目都与来自父项的值绑定),那么这个逻辑将会一次又一次地运行。

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

  • 如果最终你想把这个值发送到服务器,那么计算出来的observable自然会出现在你的JSON输出中,而一个正常函数结果的值在转换成JSON时会消失(你将不得不做更多的工作首先从该函数填充属性)。