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

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

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

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

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

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

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

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

  效果图:

  

  可写的计算属性

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

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

  对fullName的计算属性进行调整

myViewModel.fullName = ko.computed({
read:function(){
return this.firstName() + " " + this.lastName();
},
write:function(value){
var lastSpacePos = value.lastIndexOf(" ");
if(lastSpacePos>0){
this.firstName(value.substring(0,lastSpacePos));
this.lastName(value.substring(lastSpacePos + 1));
}
},
owner:myViewModel
});

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

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

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

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

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

  效果图:

  

  验证用户输入

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

var myViewModel = {
firstName:ko.observable('lady'),
lastName:ko.observable('Gaga'),
age:ko.observable(30),
ageWasValid:ko.observable(true)
};

  添加一个计算属性

myViewModel.ageValue = ko.computed({
read:myViewModel.age,
write:function(value){
if(isNaN(value)){
this.ageWasValid(false);
}else{
this.ageWasValid(true);
this.age(value);
}
},
owner:myViewModel
});

  进行绑定View视图界面元素

<p>Enter a age:<input data-bind="value: ageValue"/></p>
<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. redis.conf详细说明

    daemonize yes #---默认值no,该参数用于定制redis服务是否以守护模式运行.--- pidfile /var/run/redis.pid #默认值/var/run/redis.pi ...

  2. 【51NOD-0】1011 最大公约数GCD

    [算法]欧几里德算法 #include<cstdio> int gcd(int a,int b) {?a:gcd(b,a%b);} int main() { int a,b; scanf( ...

  3. HDU 1548 A strange lift (广搜)

    题目链接 Problem Description There is a strange lift.The lift can stop can at every floor as you want, a ...

  4. Python与RPC -- (转)

    XML-RPC xmlrpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据. 一个rpc系统,必然包括2个部分: 1)rpc client,用来向rpc server调 ...

  5. HTTPS加密通信原理及数字证书系统

    https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据 ...

  6. css position的值

    值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...

  7. Python学习笔记 - day12 - Python操作NoSQL

    NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...

  8. linux下实现在程序运行时的函数替换(热补丁)【转】

    转自:http://www.cnblogs.com/leo0000/p/5632642.html 声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术 ...

  9. golang锁记

    golang中有两个锁实现 atomic的CAS实现锁 首先是inter cpu,熟悉汇编的人都知道,inter指令集有个lock,如果某个指令集前面加个lock,那么在多核状态下,某个核执行到这个前 ...

  10. nginx学习时使用EditPuls编辑conf.xml

    一.Nginx简介:是一个使用c语言开发的高性能的http服务器及反向代理服务器 二.由于在linux环境中使用vim修改配置文件相对困难.为此,我们可以借助EditPlus将虚拟机上面的目录引用到E ...