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

Dun*_*can 54 knockout-2.0 knockout.js 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>
Run Code Online (Sandbox Code Playgroud)

这里的一切似乎都像你期望的那样工作,所以我应该使用以下原因:

?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>
Run Code Online (Sandbox Code Playgroud)

我注意到http://knockoutjs.com/documentation/computedObservables.html上的文档声明"...声明性绑定只是作为计算的observables实现",所以这是否意味着我需要在我的viewmodels中明确使用它们?

RP *_*yer 74

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

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

  • 计算的observable的值是高速缓存的,因此只有在创建它时以及更新依赖项时才会更新它.对于常规函数,您需要每次都执行逻辑.如果很多事情取决于值(比如集合中的每个项目都对从父值绑定),那么这个逻辑将会得到一次又一次地运行.

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

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

  • 依赖性是在计算被计算时确定的.因此,访问可观察值的行为会增加对当前计算值的依赖性.没有必要的功能解析.希望有所帮助! (4认同)