55

在使用淘汰赛时,使用只读计算的可观察对象而不是简单的函数有什么优势?

以下面的viewmodel构造函数和html片段为例:​</p>

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 实现”,这是否意味着我需要在我的视图模型中明确使用它们?

4

1 回答 1

76

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

以下是关于计算的 observable 与函数需要考虑的一些事项

  • 计算出的 observable 的值是缓存的,因此它仅在创建时和更新依赖项时更新。对于常规函数,您需要每次都执行逻辑。如果很多事情都依赖于该值(例如集合中的每个项目都绑定到来自父级的值),那么这个逻辑将一次又一次地运行。

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

  • 如果最终您想将值发送到服务器,则计算出的 observable 自然会出现在您的 JSON 输出中,而作为普通函数结果的值在转换为 JSON 时只会消失(您必须做更多的工作才能首先从该函数填充一个属性)。

于 2012-07-17T17:55:33.993 回答