Knockout.js 互动版

ko.computed

如果你已经有了一个监控属性firstNamelastName,如果你想显示全名该怎么做呢?这个时候就可以通过计算属性(ko.computed)来实现,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变他们就会跟着改变。如下代码:

function AppViewModel(){
 this.firstName=ko.observable('Bob');
 this.lastName=ko.observable('Smith');
}

下面添加一个计算属性来返回全名,例如:

function AppViewModel(){
 // ... leave firstName and lastName unchanged ... 
this.fullName=ko.computed(function(){
   return this.firstName()+" "+this.lastName();
 },this);}

下面就可以将它绑定到UI对象上了,如:

The name is <span data-bind="text: fullName"></span>

firstName或者lastName变化,它将会随时更新(当依赖关系发生变化,你的计算函数就会被调用,并且它的值都会更新到UI对象或其他的依赖属性上去)。

你可能想知道ko.computed的第二个参数是什么(前面的代码中我们使用到了this),当依赖属性定义了this的值,没有传递它进去,你不可能得到this.firstName()或者this.lastName()。有经验的JavaScript开发人员觉得this没什么的,但如果你不熟悉JavaScript,你就会觉得这样写很奇怪。(像C#Java这类语言不需要开发人员给this赋值,但JavaScript需要,因为在默认情况下,它的函数本身并不是任何对象的一部分)。

以上计算属性方法还可以简化为:

function AppViewModel(){
    var self=this;
    self.firstName=ko.observable('Bob');
    self.lastName=ko.observable('Smith');
    self.fullName=ko.computed(function(){
        return self.firstName()+" "+self.lastName();
 });
}

由于self在闭合的方法内部也是可以捕获到的,所以在任何嵌套函数当中,它仍然可用并保持一致性。