zoukankan      html  css  js  c++  java
  • 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 });
    
  • 相关阅读:
    [LeetCode] 137. Single Number II
    [LeetCode] 136. Single Number
    [LeetCode] 678. Valid Parenthesis String
    [LeetCode] 605. Can Place Flowers
    [LeetCode] 419. Battleships in a Board
    [LeetCode] 1002. Find Common Characters
    [LeetCode] 912. Sort an Array
    [LeetCode] 350. Intersection of Two Arrays II
    [LeetCode] 349. Intersection of Two Arrays
    [LeetCode] 820. Short Encoding of Words
  • 原文地址:https://www.cnblogs.com/DHclly/p/6204347.html
Copyright © 2011-2022 走看看