认识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 相关文章推荐
出现“不能执行已释放的Script代码”错误的原因及解决办法
Aug 29 Javascript
Javascript日期对象的dateAdd与dateDiff方法
Nov 18 Javascript
一个判断抢购时间是否到达的简单的js函数
Jun 23 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
理解Javascript的call、apply
Dec 16 Javascript
javascript轮播图算法
Oct 21 Javascript
vue bus全局事件中心简单Demo详解
Feb 26 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
Mar 01 Javascript
JS实现可针对算术表达式求值的计算器功能示例
Sep 04 Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 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中多维数组按指定value排序的实现代码
2014/08/19 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
react-router中的属性详解
2017/06/01 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
js验证账户名是否重复
2020/05/26 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
12步教你理解Python装饰器
2016/02/25 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
python logging通过json文件配置的步骤
2020/04/27 Python
python实现图片素描效果
2020/09/26 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
护士岗位职责
2014/02/16 职场文书
诚信贷款承诺书
2014/05/30 职场文书
奶茶店创业计划书
2014/08/14 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
平遥古城导游词
2015/02/03 职场文书
总账会计岗位职责
2015/04/02 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers