认识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 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
Apr 10 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
Jun 18 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
解决js正则匹配换行问题实现代码
Dec 10 Javascript
JS中Iframe之间传值的方法
Mar 11 Javascript
jQuery中end()方法用法实例
Jan 08 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
Mar 04 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
JavaScript实现滑动导航栏效果
Aug 30 Javascript
js数组常用最重要的方法
Feb 04 Javascript
解决koa2 ctx.render is not a function报错问题
Aug 07 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的博客ping服务代码
2012/02/04 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
javascript知识点收藏
2007/02/22 Javascript
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
微信小程序实现预览图片功能
2020/10/22 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
python面向对象 反射原理解析
2019/08/12 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
学年自我鉴定范文
2013/10/01 职场文书
办公室文员工作职责
2014/01/31 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
党支部鉴定意见
2015/06/02 职场文书
个人工作决心书
2015/09/22 职场文书