认识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 相关文章推荐
JS OOP包机制,类创建的方法定义
Nov 02 Javascript
推荐10 款 SVG 动画的 JavaScript 库
Mar 24 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
javascript显示系统当前时间代码
Dec 29 Javascript
JSON创建键值对(key是中文或者数字)方式详解
Aug 24 Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 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
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP之预定义接口详解
2015/07/29 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
JavaScript的目的分析
2007/01/05 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
初始Nodejs
2014/11/08 NodeJs
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
Python 列表反转显示的四种方法
2020/11/16 Python
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
麦当劳辞职信范文
2014/01/18 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2016年公司新年寄语
2015/08/17 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
flex弹性布局详解
2022/03/20 HTML / CSS
基于Redission的分布式锁实战
2022/08/14 Redis