如果需要处理由值变化而引发另一个操作的场景,可以有几种方式:
(1)Subscribe在单值变化的时候使用;
(2)Computed在多个值变化的时候使用;
(3)Extend则一般定义了通用方法,可以让多个observable公用同一个extend方法,类似于C#里面的filter.
具体用法如下:
Subscribe, 该方法有3个参数:
callback是由值变化后触发的callback函数
Target:可选项,callback的this值
event可以定义callback 函数触发的事件,比如:beforeChange,默认是用change
myViewModel.personName.subscribe(function(newValue) { alert("Theperson's new name is "+ newValue);});
PS: KO的官方文档里解释是,KO在HTML里的声明绑定(Decliaritivebinding),就是使用subscribe的机制来实现的。
既然可以显示声明subscribe,也就可以把它dispose掉
var subscription =myViewModel.personName.subscribe(function(newValue) {/* do stuff */});
// ...then later...
subscription.dispose();// I no longer want notifications
Computed:
如果在computed里面的KO对象的值有变更,都会触发computed函数执行:
functionAppViewModel(){this.firstName = ko.observable('Bob');
this.lastName = ko.observable('Smith');
}
functionAppViewModel(){
// ... leave firstName and lastNameunchanged ...
this.fullName = ko.computed(function() {
returnthis.firstName() +" "+this.lastName();
},this);}
这里,传递this是 为了在computed里读取fistName和lastName.
区别:Computed VS Pure Computed
Pure Computed只有当有其他subscriber的时候才会有这个对象,所对应的DOM对象 不激活的时候不存在,这样可以防止内存泄露,在Component等场景下不用担心dispose的问题。
如果computed里面的对象不会有其他写的操作,优先使用pure computed