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 });
posted @   DHclly  阅读(448)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示