Knockout.js 淘汰:计算的可观测vs函数

Knockout.js 淘汰:计算的可观测vs函数,knockout.js,knockout-2.0,computed-observable,Knockout.js,Knockout 2.0,Computed Observable,当使用knockout时,使用只读计算观察值而不是简单函数的优势是什么 以以下viewmodel构造函数和html代码段为例:​ var ViewModel = function(){ var self = this; self.someProperty = ko.observable("abc"); self.anotherProperty = ko.observable("xyz"); self.someComputedProperty = function(

当使用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=这个;
self.someProperty=ko.可观察(“abc”);
self.anotherProperty=ko.可观察(“xyz”);
self.someComputedProperty=函数(){
返回self.someProperty()+self.anotherProperty();
};    
};

这里的一切似乎都如您所期望的那样工作,那么我是否有理由改用:

​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>
​var ViewModel=函数(){
var self=这个;
self.someProperty=ko.可观察(“abc”);
self.anotherProperty=ko.可观察(“xyz”);
self.someComputedProperty=ko.computed(函数(){
返回self.someProperty()+self.anotherProperty();
});    
};


我注意到,位于的文档声明“……声明性绑定只是作为计算的可观察对象实现的”,那么这是否意味着我需要在我的viewmodels中显式地使用它们?

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

<> P>关于计算的可观测值与函数

有一些要考虑的事情
  • 计算出的可观测值是缓存的,因此只有在创建该值和更新依赖项时才会更新该值。对于常规函数,每次都需要执行逻辑。如果许多事情都依赖于该值(比如集合中的每个项都与父项中的值绑定),那么该逻辑将一次又一次地运行

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

  • 如果最终希望将值发送到服务器,则JSON输出中将自然显示一个计算的可观察值,而一个普通函数的结果值在转换为JSON时将消失(您必须先做更多的工作,从该函数填充属性)


回答得好。有时,当我希望每次都执行完整的逻辑时,我会使用一个函数而不是一个计算的。当我只传递一个函数时,它怎么知道一个计算的可观测值依赖于另一个可观测值?它会解析那个函数吗阅读剔除源代码的时间我猜依赖项是在计算过程中确定的。因此,访问可观察值的行为会给当前计算值增加一个依赖项。不需要对函数进行解析。希望有帮助!