knockoutJS学习笔记04:监控属性
一、语法介绍
先来看一个简单的例子:
<span data-bind="text:name"></span>
var obj = {name:ko.observable("tom")}
ko.applyBindings(obj);
这样会自动完成绑定。其中有3个特别的地方:1. data-bind。2.ko.observable 方法。 3.ko.applyBindings 方法。
1.1 data-bind
data-bind 并不是html元素的固有属性,但它是完全正确的(符合html5规范),虽然在非html5验证器中会提示这是一个无效的属性,但这不会有任何问题。ko就是用data-bind来声明绑定的。
data-bind 依赖于标签,也就是data-bind必须作为标签属性写在标签内。所以我们要输出一个变量,也必须绑定在标签内才能输出。
例如:data-bind="text:name",text 是我们要绑定的“属性”,例如要为 span、div 赋值,就用 text;这个与jquery 的写法是一样的,例如我们会用 $("#id").text(str); 如果是一个编辑框呢?就是 value:name 了。
这里有一个小小的建议,很多时候我们会在标签里自定义属性,例如userid,建议都用 data- 开头,例如:data-userid。
1.2 observable
有了视图,还要数据。如过上面属性直接写为: name:"tom",也是可以完成绑定的。不过这样就只是单向、一次性绑定了。如果要进行双向绑定,就要用 observable方法了,用了该方法后,该属性就不是简单的js对象属性了,而是ko特有的对象,取值和赋值也都跟普通属性不一样了。
1.3 applyBindings
有了视图和数据,只需要触发绑定操作就ok了。ko的applyBindings 方法就是触发绑定的,它有2个参数,第一个参数是数据对象,第二个参数是可选的,用来设置使用 data-bind 的html元素或容器。例如,有时候界面上有很多处绑定,为了让结构更加清晰和避免冲突,可以用:ko.applyBindings(obj,document.getElementById("list")); 这样就表示obj对象绑定在id为list内,声明有 data-bind 的html元素。
了解了ko的绑定方式后,我们来总结一下数据绑定的几种方式:
一般的数据绑定有三种:One-Time,One-Way,Two-way。
One-Time绑定模式:从viewModel绑定至UI这一层只进行一次绑定,程序不会继续追踪数据的在两者中任何一方的变化,这种绑定方式适用于数据仅仅会加载一次的情况。
One-Way绑定模式:单向绑定,即object-UI的绑定,只有当viewModel中数据发生了变化,UI中的数据也将会随之发生变化,反之不然。
Two-Way绑定模式:双向绑定,无论数据在Object或者是UI中发生变化,应用程序将会更新另一方,这是最为灵活的绑定方式,同时代价也是最大的。
数据绑定只是作为元素的自定义属性写上标签内,并不能决定它是何种绑定。
如果值是通过ko.observable定义的说明是双向绑定,否则为One-Time绑定,在knockout不存在单向绑定。
二、监控属性的取值/赋值
2.1 取值
上面说到observable属性不再是普通属性,它的取值也不再是obj.name这样的格式了,而是通过 obj.name() 这样获得,实际上我们可以将 name 打印出来,它已经变成一个函数了。
2.2 赋值
同理,赋值不能用 obj.name = "xxx",而是用 obj.name("xxx"); 这种取值和赋值的方法设计和jquery的设计是一样的。而且,这里也可以链式调用,例如:obj.name("xxx").age("20");
2.3 例子
接下来就通过一个例子来体会双向绑定。当编辑框失去焦点时,右边的自动更新,点击清空恢复原状。这个过程没有用到dom操作。

html:
<p>姓名:<input type="text" data-bind="value:name" /> 您输入的姓名:<span data-bind="text:name"></span></p>
<p>年龄:<input type="text" data-bind="value:age" /> 您输入的姓名:<span data-bind="text:age"></span></p>
<p><input type="button" value="清空" onclick="reset()" /></p>
js:
var obj = {
name : ko.observable(""),
age : ko.observable(0)
}
ko.applyBindings(obj);
function reset(){
obj.name("");
obj.age(0);
}
三、compute
计算属性。熟悉数据库的朋友应该了解有个字段叫做【计算字段】,顾名思义,这个字段的值是由其它字段计算而来的。ko里的计算属性也是一样的,由其它属性计算而来,具体计算方式由我们控制。例如上面的例子,我们想在输入姓名和年龄后自动完成:“姓名,年龄” 这样的格式就可以用计算属性。如:
<p>总信息:<span data-bind="text:format"></span></p>
这里把数据改为 function 的写法,因为在js里函数也是对象,这也是一种推荐的写法。
function Person(){
this.name = ko.observable("");
this.age = ko.observable(0);
this.format = ko.computed(function(){
return this.name() + "," + this.age();
},this);
}
var person = new Person();
ko.applyBindings(person);
function reset(){
person.name("");
person.age(0);
}
这里要注意的是 this 是作为 computed 的参数传入。因为我们要获得Person对象的name和age属性,而传入的this,经调用构造函数后,就指向了Person对象。如果没有这样传入呢?那么this指向的是window对象。关于this 的用法也可以看这篇文章:我这样理解js里的this。
另外,计算属性还支持下面的写法,支持更复杂的操作,不过一般很少用到。如下:
this.format = ko.computed({
read:function(){return this.name() + "," + this.age;},
write:function(value){console.log(value);},
owner:this
});
四、总结
observable 是ko 的核心之一,是它在对象的属性和dom之间建立了绑定。
knockoutJS学习笔记04:监控属性的更多相关文章
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- WPF 学习笔记-设置属性使窗口不可改变大小
原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- KnockoutJs学习笔记(五)
作为一名初学者来说,一篇篇的按顺序看官网上的文档的确是一件很痛苦的事情,毕竟它的排列也并非是由浅及深的排列,其中的顺序也颇耐人寻味,于是这篇文章我又跳过了Reference部分,进而进入到具体的bin ...
- knockoutJS学习笔记06:ko数组与模板绑定
前面已经介绍了基本的绑定和模板相关知识,接下来就看ko里的数组和模板绑定,数组和模板绑定应该是实际项目中用得比较多的,ko提供了很好的支持. 一.observaleArray 前面的监控属性都是单个对 ...
- xml基础学习笔记04
今天继续xml学习,主要是:SimpleXML快速解析文档.xml与数组相互转换 .博客中只是简单的做一个学习记录.积累.更加详细的使用方法,可以查看php手册 1.SimpleXML快速解析文档 前 ...
- 《C# 语言学习笔记》——定义属性
属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...
- knockoutJS学习笔记09:使用mapping插件
一.问题引出 通常,我们先定义好html结构或者模板,通过ajax向后台发起请求,后台返回json数据,然后再将json数据渲染到页面上.以博客园个人博客里的个人信息为例子,如图: 1.定义html. ...
随机推荐
- 精心挑选10款优秀的 jQuery 图片左右滚动插件
在现代的网页设计中,图片和内容滑块是一种极为常见和重要的元素.你可以从头开始编写自己的滑动效果,但是这将浪费很多时间,因为网络上已经有众多的优秀的 jQuery 滑块插件.当然,如果要从大量的 jQu ...
- keleyi菜单0.1.5版本发布了
keleyi菜单是一个让你轻松创建向上弹出菜单的jquery插件. 最新版本0.1.5增加了显示三角形的功能,当一级菜单包含有子菜单时,会在一级菜单的右侧显示一个小三角形.如图所示: 查看例子:htt ...
- MySQL中进行模糊搜索的一些问题
在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE 运算符一起使用.在 SQL 中,可使用以下通配符:通配符 描述 % 替代一个或多个字符 ...
- JavsScript+dom
JavsScript+dom DOM(兼容性) 用于操作文档树 1.帮助我们找到标签 直接查找 间接查找 getElementById getElementsByTageName 2.标签操作 内容: ...
- nth-child和:nth-of-type的区别
:nth-of-type为什么要叫:nth-of-type?因为它是以"type"来区分的.也就是说:ele:nth-of-type(n)是指父元素下第n个ele元素, 而ele: ...
- arcgis地图数据集合
一.全国的ArcGIS地图SHP格式数据,覆盖的图层信息量基本齐全,除了ArcGIS之外,其他GIS软件(superMap和MapGIS.MapInfo等等)也是用之,适合为GIS开发提供数据素材. ...
- iOS AutoLayout的用法
添加约束 代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayou ...
- SU54 新建视图簇 维护数据表
由于一些数据表的数据比较重要,不允许直接查看数据表中的数据或者通过SM30进行维护, 故可以通过新建一个视图簇的方式来实现,然后通过程序调用这个视图簇,来进行数据的维护. 运行事务码SE54 最后通过 ...
- css解决方案
1,Flexbox(更优雅的布局) ①居中:{display:flex; justify-content:center; align-items:center;}②设定flex-grow属性的话,会自 ...
- HSDB - HotSpot debugger
HSDB 是专门用于调试 HotSpot VM 的调试器,它是一个图形化界面.与之对应的还有个 CLHSDB-Command Line HotSpot Debugger,命令行调试界面.下面是启动命令 ...