在Knockout2.0之前,计算属性被称之为依赖属性,在2.0版本中,ko.dependentObservable重命名为ko.computed,因为它在读、解释和类型上更简单。在实际使用中,ko.dependentObservable和ko.computed是等价的。

  如果有两个监控属性firstName和lastName,想显示全名,就可以使用计算属性,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变,他们就会跟着改变。

  1. var myViewModel = {
  2. firstName:ko.observable('lady'),
  3. lastName:ko.observable('Gaga')
  4. };

  添加一个计算属性来返回全名

  1. myViewModel.fullName = ko.computed(function(){
  2. return this.firstName() + " " + this.lastName();
  3. },myViewModel);

  并且绑定到View视图界面上的元素

  1. The fullname is <span data-bind="text: fullName"></span>

  不管是firstName还是lastName改变,全名fullName都会自动更新

  效果图:

  

  可写的计算属性

  计算属性是通过计算其他监控属性而得到的一个值。所以,计算属性一般都是只读的。实际上只需要提供一个回调函数就能实现写入功能,然后可以把这个可写的计算属性当成一个普通的监控属性来使用,通过自定义的逻辑来实现它的读和写。

  1. var myViewModel = {
  2. firstName:ko.observable('lady'),
  3. lastName:ko.observable('Gaga')
  4. };

  对fullName的计算属性进行调整

  1. myViewModel.fullName = ko.computed({
  2. read:function(){
  3. return this.firstName() + " " + this.lastName();
  4. },
  5. write:function(value){
  6. var lastSpacePos = value.lastIndexOf(" ");
  7. if(lastSpacePos>0){
  8. this.firstName(value.substring(0,lastSpacePos));
  9. this.lastName(value.substring(lastSpacePos + 1));
  10. }
  11. },
  12. owner:myViewModel
  13. });

  ♦ read(必选):一个用来执行取得依赖监控属性当前值的函数

  ♦ write(可选):如果声明将是你的依赖属性可写

  ♦ owner(可选):如果声明,它就是KO调用read或write的回调函数时用到的this

  在这个例子上,write回调事件来处理用户输入的值将其分解成“firstName”和“lastName”两个部分,并将这些值返回到底层监控属性上。可以将view model绑定到DOM元素上。

  1. <p>First name:<span data-bind="text:firstName"></span></p>
  2. <p>Last name: <span data-bind="text: lastName"></span></p>
  3. <p>Full name: <input data-bind="value: fullName"/></p>

  效果图:

  

  验证用户输入

  在上面的ViewModel中添加两个个属性

  1. var myViewModel = {
  2. firstName:ko.observable('lady'),
  3. lastName:ko.observable('Gaga'),
  4. age:ko.observable(30),
  5. ageWasValid:ko.observable(true)
  6. };

  添加一个计算属性

  1. myViewModel.ageValue = ko.computed({
  2. read:myViewModel.age,
  3. write:function(value){
  4. if(isNaN(value)){
  5. this.ageWasValid(false);
  6. }else{
  7. this.ageWasValid(true);
  8. this.age(value);
  9. }
  10. },
  11. owner:myViewModel
  12. });

  进行绑定View视图界面元素

  1. <p>Enter a age:<input data-bind="value: ageValue"/></p>
  2. <font data-bind="visible: !ageWasValid()" color="red">That's not a number!</font>

  效果图:

  

  

  依赖跟踪的原理

  1.声明一个依赖属性时,KO会立即调用求值算法得到其初始值;

  2.计算函数运行的时候,KO会把监控属性通过计算得到的值都记录在一个Log中;

  3.计算结束的时候,KO会订阅能够访问的监控属性或依赖属性,订阅的回调函数是重新运行计算函数,循环整个过程,回到步骤1(并且注销不再使用的订阅);

  4.KO会通知所有的订阅者,依赖属性已经被设置了新值。

  所以说,KO并不仅仅是在第一次执行计算函数时检测你的依赖项,它每次都会检测。这意味着,你的依赖是可以动态的,你不需要定义依赖关系:在代码运行时会自动检测到。

Knockout.js(三):计算属性(Computed Observable)的更多相关文章

  1. Vue.js之计算属性(computed)、属性监听(watch)与方法选项(methods)

    vue.js官网:https://cn.vuejs.org/v2/guide/components-registration.html 一.计算属性-computed 1. 作用:能够避免数据冗余,通 ...

  2. vue从入门到进阶:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  3. Vue教程:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  4. Vue.js 计算属性(computed)

    Vue.js 计算属性(computed) 如果在模板中使用一些复杂的表达式,会让模板显得过于繁重,且后期难以维护.对此,vue.js 提供了计算属性(computed),你可以把这些复杂的表达式写到 ...

  5. Vue学习3:计算属性computed与监听器

    下面是计算属性相关代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  6. vue2.0中的watch和计算属性computed

    watch和computed均可以监控程序员想要监控的对象,当这些对象发生改变之后,可以触发回调函数做一些逻辑处理 watch监控自身属性变化 <!DOCTYPE html> <ht ...

  7. 007——VUE中非常使用的计算属性computed实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Vue.js:计算属性

    ylbtech-Vue.js:计算属性 1.返回顶部 1. Vue.js 计算属性 计算属性关键词: computed. 计算属性在处理一些复杂逻辑时是很有用的. 可以看下以下反转字符串的例子: 实例 ...

  9. 计算属性 computed

    计算属性 computed 计算缓存 vs Methods <div id="example"> <p>Original message: "{{ ...

  10. 怎样理解 Vue 中的计算属性 computed 和 methods ?

    需求: 在 Vue 中, 我们可以像下面这样通过在 引号 或 双花括号 内写 js 表达式去做一些简单运算, 这是可以的, 不过这样写是不直观的, 而且在 html 中 夹杂 一些运算逻辑这种做法其实 ...

随机推荐

  1. sublime text 快速编码技巧 GIT图

    网上到处都云云sublime有多好.用了一年多的时间,受益匪浅,减少了很多重复性的劳动. 特别是: 1.灵活强大的多行编辑功能: 2.快速查找文件 ctrl + p; 3.正则查找 + 多行编辑; 4 ...

  2. 获取子iframe框架的元素

    我们常常遇到使用iframe框的时候,该iframe框不能根据自己内部的内容撑起来的这种问题 必要条件:不能在跨域的情况下...本地可以放到localhost下进行测试 //父页面index.html ...

  3. bzoj 1188 SG函数

    首先我们可以把一个石子看成一个单独的游戏,那么我们可以发现所有位置的石子至于奇偶有关,因为某一个人操作其中的一个石子,我们可以用相同的石子做相同的操作,所以我们只需要保留下所有位置的01,那么对于每个 ...

  4. Bower A package manager for the web

    Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. Bower doe ...

  5. JavaScript match() 方法

    match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. var st ...

  6. skb管理函数之alloc_skb、dev_alloc_skb、kfree_skb、dev_kfree_skb、consume_skb

    alloc_skb--分配skb dev_alloc_skb--分配skb,通常被设备驱动用在中断上下文中,它是alloc_skb的封装函数,因为在中断处理函数中被调用,因此要求原子操作(GFP_AT ...

  7. CentOS7手动编译安装内核4.11.7

    1. 进入/usr/src/目录 cd /usr/src 2. 下载内核源码,网址:https://www.kernel.org wget https://cdn.kernel.org/pub/lin ...

  8. c语言简单实现telnet客户端

    c语言简单实现telnet客户端 http://blog.csdn.net/haiwenchen/article/details/69944118

  9. js中常用的数组方法

    在数组的尾部增加或删除某个元素:push() 和 pop() push() : 在数组的尾部追加一个或多个元素,并返回数组的长度 pop():在数组的尾部删除一个元素,并返回被删除项 var arr ...

  10. (转)函数后面加const--C++ const成员函数

    类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于 ...