Knockout v3.4.0 中文版教程-3-监控-通过监控创建视图模型(下)

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不能保证beforeChangechange事件成对出现,因为代码的其他部分可能会单独引发任一事件。 如果您需要跟踪一个observable对象的先前值,您要使用订阅来捕获和跟踪它。

7. 强制observable对象总是通知订阅者

当写一个observable对象包含原始值(可以是数字、字符串、布尔值或者null),依赖监控通常只有在值实际改变时才进行通知。但是,可以使用内置的notify extender来确保observable对象的订阅者总是在写入时通知,即使写入值是相同的。你可以将扩展器应用到一个observable对象上,如下:

myViewModel.personName.extend({ notify: 'always' });

8. 延迟或阻止更改通知

通常情况下,一个监控对象只要发生改变就会立即通知订阅者。但是一个监控对象频繁重复改变或触发一直更新,代价会很大,通过限制或延迟监控到的更改通知,可以获得更好的性能。可以使用频率限制扩展器来完成,如下:

// 确保每50毫秒内通知改变不超过一次
myViewModel.personName.extend({ rateLimit: 50 });
原文地址:https://www.cnblogs.com/DHclly/p/6204347.html