认识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 相关文章推荐
SyntaxHighlighter代码加色使用方法
Sep 07 Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 Javascript
jQuery取得select选择的文本与值的示例
Dec 09 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
JavaScript实现邮箱地址自动匹配功能代码
Nov 28 Javascript
详解jQuery lazyload 懒加载
Dec 19 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
Vue修改mint-ui默认样式的方法
Feb 03 Javascript
在微信小程序中保存网络图片
Feb 12 Javascript
jquery绑定事件 bind和on的用法与区别分析
May 22 jQuery
深入分析JavaScript 事件循环(Event Loop)
Jun 19 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和ACCESS写聊天室(八)
2006/10/09 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
php组合排序简单实现方法
2016/10/15 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
详解vue 命名视图
2019/08/14 Javascript
Python 功能和特点(新手必学)
2015/12/30 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python实现选择排序
2017/06/04 Python
python实现爬取图书封面
2018/07/05 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
法律六进活动方案
2014/03/13 职场文书
《称象》教学反思
2014/04/25 职场文书
ktv筹备计划书
2014/05/03 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
大学生个人总结范文
2015/02/15 职场文书
绿色环保倡议书
2015/04/28 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP