认识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延迟加载
Mar 09 Javascript
js window.onload 加载多个函数的方法
Nov 02 Javascript
JS预览图像将本地图片显示到浏览器上
Aug 25 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
Nov 21 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Apr 20 Javascript
JavaScript实现模态对话框实例
Jan 13 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
dedecms模板标签代码官方参考
2007/03/17 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
vue.js的提示组件
2017/03/02 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
python对json的相关操作实例详解
2017/01/04 Python
Python模块文件结构代码详解
2018/02/03 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
三年级音乐教学反思
2014/01/28 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
化妆品活动策划方案
2014/05/23 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang