认识Knockout及如何使用Knockout绑定上下文


Posted in Javascript onDecember 25, 2015

Knockout介绍

Knockout简称ko,是一个轻量级的javascript类库,采用MVVM设计模式(即Model、view、viewModel),简单优雅的实现了双向绑定,实时更新,帮助您使用干净的数据模型来创建丰富的、响应式的用户界面。

Knockout有三大核心特性:

    1.优雅的依赖跟踪(Elegant dependency tracking):任何时候数据模型的变化都会自动更新相应的UI部分;

    2.声明式绑定(Declarative bindings) : 简单的将UI和你的数据模型关联起来,你就可以创建复杂的动态UI;

    3.高度可扩展性(Trivially extensible) : 只需几行代码实现一个自定义的行为来作为声明式绑定;

其他优点:

    1.纯净的javascript代码;

    2.可以随时添加到你现有的web应用中;

    3.轻量级,GZIP后只有13K;

    4.能够工作于几乎所有主流浏览器((IE 6+, Firefox 2+, Chrome, Safari, Edge, others);

ko采用的是MVVM设计模式,即model view viewModel。

简单的例子

There are <span data-bind="text: myItems().length"></span> items

就是这么简单,你不必写代码来更新text内容,它会在数组长度改变时自动更新,与此类似,如果我们想利用数组长度控制按钮的可用性仅仅需要:

<button data-bind="enable: myItems().length < 5">Add</button>

下面接着给大家介绍使用Knockout绑定上下文

Binding context

binding context是一个保存数据的对象,你可以在你的绑定中引用它。当应用绑定的时候,knockout自动创建和管理binding context的继承关系。这种层次结构的根引用你指定的viewModel参数(ko.applyBindings(viewModel))。

然后每次使用一个控制流如with或者foreach 来创建一个子节点binding context引用嵌套的viewModel data。

$parent

<h1 data-bind="text: name"></h1>
<div data-bind="with: manager">
 <!-- Now we're inside a nested binding context -->
 <span data-bind="text: name"></span> is the
 manager of <span data-bind="text: $parent.name"></span>
</div>

$parents

这是一个数组,代表了所有的父节点view models

$parent[0] : 代表父节点;

$parent[1] : 代表祖父节点;

$parent[1] : 代表曾祖父节点;

.....以此类推

$root

它是root context的根节点视图模型对象,一般是通过ko.applyBindings指定的,相当于$parents[$parents.length - 1]。

$component

如果你在一个特定的组件模板的上下文中,$component指定的是那个component,它的指定组件相当于$root,在嵌套的组件情况下,它代表了最邻近的一个组件。

$data

它代表了当前上下文中的viewModel对象,$data和$root是相当的。在嵌套的binding context中,这个参数将设置到当前的数据项。

$data是非常有用的,例如,当你想引用viewModel本身而不是viewModel的属性的时候。

<ul data-bind="foreach: ['cats', 'dogs', 'fish']">
 <li>The value is <span data-bind="text: $data"></span></li>
</ul> 
$index(仅在foreach binding中可用)

它是一个在foreach绑定中的数组的从0开始的索引条目。不想其他的context属性,$index是observable的,即会随着数组item的更新而更新。

$parentContext

指定了父节点级别的binding context对象,与$parent不同的是,它是在父节点中指定数据而不是binding context。

$rowData

它是在当前上下文中,原viewModel的值,通常它相当于$data,但是,如果viewModel被ko以observable来修饰,$data是unobservable的,而$rowData是observable的。

Javascript 相关文章推荐
使一个函数作为另外一个函数的参数来运行的javascript代码
Aug 13 Javascript
用JavaScript实现单继承和多继承的简单方法
Mar 29 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
Mar 05 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 Javascript
Node.js Express 框架 POST方法详解
Jan 23 Javascript
ES6中Math对象的部分扩展
Feb 20 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
深入理解JS异步编程-Promise
Jun 03 Javascript
详解Document.Cookie
Dec 25 #Javascript
不得不分享的JavaScript常用方法函数集(下)
Dec 25 #Javascript
JQuery datepicker 用法详解
Dec 25 #Javascript
一道JS前端闭包面试题解析
Dec 25 #Javascript
干货分享:让你分分钟学会javascript闭包
Dec 25 #Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 #Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
Dec 25 #Javascript
You might like
Symfony学习十分钟入门经典教程
2016/02/03 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
Python入门篇之面向对象
2014/10/20 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
求职简历中的自我评价分享
2013/12/08 职场文书
50岁生日感言
2014/01/23 职场文书
周年庆促销方案
2014/03/15 职场文书
学习雷锋标语
2014/06/25 职场文书
物流管理专业推荐信
2014/09/06 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫