ko.computed
如果你已经有了一个监控属性firstName和lastName,如果你想显示全名该怎么做呢?这个时候就可以通过计算属性(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在闭合的方法内部也是可以捕获到的,所以在任何嵌套函数当中,它仍然可用并保持一致性。