认识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实现二分查找法实现代码
Nov 12 Javascript
this和执行上下文实现代码
Jul 01 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
Nov 05 Javascript
JavaScript中的继承方式详解
Feb 11 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
Aug 03 Javascript
微信小程序 Buffer缓冲区的详解
Jul 06 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
Mar 05 Javascript
angularjs结合html5实现拖拽功能
Jun 25 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
Apr 10 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
微信小程序 下拉刷新及上拉加载原理解析
Nov 06 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通用分页类page.php[仿google分页]
2008/08/31 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
一个PHP分页类的代码
2011/05/18 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
php实现socket推送技术的示例
2017/12/20 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
《骑牛比赛》教后反思
2014/04/22 职场文书
驾驶员培训方案
2014/05/01 职场文书
邓小平理论心得体会
2014/09/09 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
表扬信范文
2015/05/04 职场文书
辞职信格式范文
2015/05/13 职场文书
开学典礼致辞
2015/07/29 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
python字符串的一些常见实用操作
2022/04/06 Python
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL