6. 显式订阅监控
你通常不需要手动设置订阅,所以初学者应该跳过这一节。
对于高级用户,如果你想注册自己的订阅来监控通知变化,你可以使用 subscribe
函数,比如:
myViewModel.personName.subscribe(function(newValue) {
alert("The person's new name is " + newValue);
});
KO内部很多部分都是由subscribe
来实现。大多数情况下你不需要使用它,因为内置绑定和模板系统要管理订阅。
subscribe
接收3个参数:callback
是一个函数,无论何时通知发生,target
(可选)定义在回调函数里面this
的值,event
(可选,默认值为change
)是接收通知的事件名。
如果你愿意,也可以终止订阅:首先捕获返回值作为一个变量,然后你可以调用它的处理函数,比如:
var subscription = myViewModel.personName.subscribe(function(newValue) { /* 做一些事 */ });
// ...然后...
subscription.dispose(); // 我不再想要通知了
如果你想要一个监控值在即将被改变之前通知,你可以订阅beforeEvent
事件,比如:
myViewModel.personName.subscribe(function(oldValue) {
alert("The person's previous name is " + oldValue);
}, null, "beforeChange");
注意:Knockout不能保证beforeChange
和change
事件成对出现,因为代码的其他部分可能会单独引发任一事件。 如果您需要跟踪一个observable对象的先前值,您要使用订阅来捕获和跟踪它。
7. 强制observable对象总是通知订阅者
当写一个observable对象包含原始值(可以是数字、字符串、布尔值或者null),依赖监控通常只有在值实际改变时才进行通知。但是,可以使用内置的notify extender
来确保observable对象的订阅者总是在写入时通知,即使写入值是相同的。你可以将扩展器应用到一个observable对象上,如下:
myViewModel.personName.extend({ notify: 'always' });
8. 延迟或阻止更改通知
通常情况下,一个监控对象只要发生改变就会立即通知订阅者。但是一个监控对象频繁重复改变或触发一直更新,代价会很大,通过限制或延迟监控到的更改通知,可以获得更好的性能。可以使用频率限制扩展器来完成,如下:
// 确保每50毫秒内通知改变不超过一次
myViewModel.personName.extend({ rateLimit: 50 });