1 Knockout简介 (Introduction)

Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化。

Knockout有如下4大重要概念:

◆ 声明式绑定 (Declarative Bindings):使用简明易读的语法很容易地将模型(model)数据关联到DOM元素上。

◆ UI界面自动刷新 (Automatic UI Refresh):当您的模型状态(model state)改变时,您的UI界面将自动更新。

◆ 依赖跟踪 (Dependency Tracking):为转变和联合数据,在你的模型数据之间隐式建立关系。

◆ 模板 (Templating):为您的模型数据快速编写复杂的可嵌套的UI。

简称:KO

官方网站:http://knockoutjs.com

2 入门介绍 (Getting started)

2.1 KO工作原理及带来的好处

Knockout是一个以数据模型(data model)为基础的能够帮助你创建富文本,响应显示和编辑用户界面的JavaScript类库。任何时候如果你的UI需要自动更新(比如:更新依赖于用户的行为或者外部数据源的改变),KO能够很简单的帮你实现并且很容易维护。

重要特性:

◆ 优雅的依赖追踪- 不管任何时候你的数据模型更新,都会自动更新相应的内容。

◆ 声明式绑定- 浅显易懂的方式将你的用户界面指定部分关联到你的数据模型上。

◆ 灵活全面的模板- 使用嵌套模板可以构建复杂的动态界面。

◆ 轻易可扩展- 几行代码就可以实现自定义行为作为新的声明式绑定。

额外的好处:

◆ 纯JavaScript类库 – 兼容任何服务器端和客户端技术

◆ 可添加到Web程序最上部 – 不需要大的架构改变

◆ 简洁的 – Gzip之前大约25kb

◆ 兼容任何主流浏览器 (IE 6+、Firefox 2+、Chrome、Safari、其它)

◆ Comprehensive suite of specifications (采用行为驱动开发) - 意味着在新的浏览器和平台上可以很容易通过验证。

开发人员如果用过Silverlight或者WPF可能会知道KO是MVVM模式的一个例子。如果熟悉 Ruby on Rails 或其它MVC技术可能会发现它是一个带有声明式语法的MVC实时form。换句话说,你可以把KO当成通过编辑JSON数据来制作UI用户界面的一种方式… 不管它为你做什么

OK, 如何使用它?

简单来说:声明你的数据作为一个JavaScript 模型对象(model object),然后将DOM 元素或者模板(templates)绑定到它上面.

让我们来看一个例子

想想在一个页面上,航空旅客可以为他们的旅行升级高级食物套餐,当他们选择一个套餐的时候,页面立即显示套餐的描述和价格。首先,声明可用的套餐:

 
  1. var availableMeals = [  { mealName: 'Standard', description: 'Dry crusts of bread', extraCost: 0 },  { mealName: 'Premium', description: 'Fresh bread with cheese', extraCost: 9.95 },  { mealName: 'Deluxe', description: 'Caviar and vintage Dr Pepper', extraCost: 18.50 }  ]; 

如果想让这3个选项显示到页面上,我们可以绑定一个下拉菜单(例如:<select>元素)到这个数据上。例如:

 
  1. <h3>Meal upgrades</h3>
  2. <p>Make your flight more bearable by selecting a meal to match your social and economic status.</p>
  3. Chosen meal: <select data-bind="options: availableMeals,
  4. optionsText: 'mealName'"></select>

启用Knockout并使你的绑定生效,在availableMeals变量声明之后添加如下代码:

 
  1. var viewModel = {
  2. /* we'll populate this in a moment */
  3. };
  4. ko.applyBindings(viewModel); // Makes Knockout get to work
  5. // 注意:ko. applyBindings需要在上述HTML之后应用才有效

你可以在这个系列里将学习更多的view model 和 MVVM。现在你的页面将render成如下的样子:

响应选择

下一步,声明一个简单的data model来描述旅客已经选择的套餐,添加一个属性到当前的view model上:

 
  1. var viewModel = {
  2. chosenMeal: ko.observable(availableMeals[0])
  3. };

ko.observable是什么?它是KO里的一个基础概念。UI可以监控(observe)它的值并且回应它的变化。这里我们设置chosenMeal是UI可以监控已经选择的套餐,并初始化它,使用availableMeal里的第一个值作为它的默认值(例如:Standard)。

让我们将chosenMeal 关联到下拉菜单上,仅仅是更新<select>元素,告诉它让<select>元素的值读取/写入chosenMeal这个模型属性:

 
  1. Chosen meal: <select data-bind="options: availableMeals,
  2. optionsText: 'mealName',
  3. value: chosenMeal"></select>

理论上说,我们现在可以读/写chosenMeal 属性了,但是我们不知道它的作用。让我们来显示已选择套餐的描述和价格:

 
  1. <p>
  2. You've chosen:
  3. <b data-bind="text: chosenMeal().description"></b>
  4. (price: <span data-bind='text: chosenMeal().extraCost'></span>)
  5. </p>

于是,套餐信息和价格,将根据用户选择不同的套餐项而自动更新:

更多关于observables和dependency tracking的使用

最后一件事:如果能将价格格式化成带有货币符号的就好了,声明一个JavaScript函数就可以实现了…

 
  1. function formatPrice(price) {
  2. return price == 0 ? "Free" : "$" + price.toFixed(2);
  3. }

… 然后更新绑定信息使用这个函数 …

 
  1. (price: <span data-bind='text: formatPrice(chosenMeal().extraCost)'></span>)

… 界面显示结果将变得好看多了:

Price的格式化展示了,你可以在你的绑定里写任何JavaScript代码,KO仍然能探测到你的绑定依赖代码。这就展示了当你的model改变时,KO如何只进行局部更新而不用重新render整个页面 – 仅仅是有依赖值改变的那部分。

链式的observables也是支持的(例如:总价依赖于价格和数量)。当链改变的时候,依赖的下游部分将会重新执行,同时所有相关的UI将自动更新。不需要在各个observables之间声明关联关系,KO框架会在运行时自动执行的。

你可以从 observables 和 observable arrays 获取更多信息。上面的例子非常简单,没有覆盖很多KO的功能。你可以获取更多的内嵌的绑定和模板绑定。

KO和jQuery (或Prototype等)是竞争关系还是能一起使用?

所有人都喜欢jQuery! 它是一个在页面里操作元素和事件的框架,非常出色并且易使用,在DOM操作上肯定使用jQuery,KO解决不同的问题。

如果页面要求复杂,仅仅使用jQuery需要花费更多的代码。 例如:一个表格里显示一个列表,然后统计列表的数量,Add按钮在数据行TR小于5调的时候启用,否则就禁用。jQuery 没有基本的数据模型的概念,所以需要获取数据的数量(从table/div或者专门定义的CSS class),如果需要在某些SPAN里显示数据的数量,当添加新数据的时候,你还要记得更新这个SPAN的text。当然,你还要判断当总数>=5条的时候禁用Add按钮。 然后,如果还要实现Delete功能的时候,你不得不指出哪一个DOM元素被点击以后需要改变。

Knockout的实现有何不同?

使用KO非常简单。将你的数据描绘成一个JavaScript数组对象myItems,然后使用模板(template)转化这个数组到表格里(或者一组DIV)。不管什么时候数组改变, UI界面也会响应改变(不用指出如何插入新行<tr>或在哪里插入),剩余的工作就是同步了。例如:你可以声明绑定如下一个SPAN显示数据数量(可以放在页面的任何地方,不一定非要在template里):

 
  1. There are <span data-bind="text: myItems().count"></span> items

就是这些!你不需要写代码去更新它,它的更新依赖于数组myItems的改变。同样, Add按钮的启用和禁用依赖于数组myItems的长度,如下:

 
  1. <button data-bind="enable: myItems().count < 5">Add</button>

之后,如果你要实现Delete功能,不必指出如何操作UI元素,只需要修改数据模型就可以了。

总结:KO没有和jQuery或类似的DOM 操作API对抗竞争。KO提供了一个关联数据模型和用户界面的高级功能。KO本身不依赖jQuery,但是你可以一起同时使用jQuery, 生动平缓的UI改变需要真正使用jQuery。

2.2 下载安装

Knockout的核心类库是纯JavaScript代码,不依赖任何第三方的类库。所以按照如下步骤即可添加KO到你的项目里:

下载Knockout类库的最新版本,在正式开发和产品使用中,请使用默认的压缩版本(knockout-x.x.js)。

下载地址:https://github.com/SteveSanderson/knockout/downloads

Debug调试目的,可使用非压缩版本(knockout-x.x.debug.js). 和压缩版本同样的功能,但是具有全变量名和注释的可读性源代码,并且没有隐藏内部的API。

在你的HTML页面里使用<script>标签引用Knockout类库文件。

这就是你需要的一切…

开启模板绑定

…除非你想使用模板绑定功能(您很有可能使用它,因为非常有用),那你需要再引用两个JavaScript文件。 KO的默认模板引擎是依赖jQuery 的jquery.tmpl.js。所以你需要下载下面的2个文件并在引用KO之前引用:

jQuery 1.4.2 或更高版本

jquery-tmpl.js — 此版本 可以很容易使用,或者你访问官方网站 查找最新版本。

正确的引用顺序:

 
  1. <script type='text/javascript' src='jquery-1.4.2.min.js'></script>
  2. <script type='text/javascript' src='jquery-tmpl.js'></script>
  3. <script type='text/javascript' src='knockout-1.2.1.js'></script>

(当然,您要根据你的文件路径累更新上面的文件路径和文件名。)

Knockout入门介绍相关推荐

  1. .NET读写Excel工具Spire.Xls使用(1)入门介绍

    原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...

  2. 独家 | 集成学习入门介绍

    作者:Jason Brownlee 翻译:wwl 校对:王琦 本文约3300字,建议阅读8分钟. 本文介绍了我们在生活中的许多决定包括了其他人的意见,由于群体的智慧,有的时候群体的决策优于个体.在机器 ...

  3. SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

    为什么80%的码农都做不了架构师?>>>    SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://proje ...

  4. ECC加密算法入门介绍

    作者  : ZMWorm[CCG]   E-Mail: zmworm@sohu.com   主页  : Http://ZMWorm.Yeah.Net/ 前言 同RSA(Ron Rivest,Adi S ...

  5. [翻译][1.4.2]Flask-Admin入门介绍

    为什么80%的码农都做不了架构师?>>>    #Flask-Admin入门介绍 ##让我们荡起双桨 初始化 Introduction To Flask-Admin Getting ...

  6. 谷歌大脑科学家亲解 LSTM:一个关于“遗忘”与“记忆”的故事 本文作者:奕欣 2017-01-14 09:46 导语:AI科技评论保证这是相对通俗易懂的一篇入门介绍了,看不懂的话欢迎关注「AI 科技

    谷歌大脑科学家亲解 LSTM:一个关于"遗忘"与"记忆"的故事 本文作者:奕欣 2017-01-14 09:46 导语:AI科技评论保证这是相对通俗易懂的一篇入 ...

  7. Tomcat容器入门介绍

    Tomcat容器入门介绍 Tomcat环境配置 PS:JDK的安装这里就不讲了,找到安装包直接下一步下一步就行了. 1.配置JDK 在Windows10下,找到环境变量 在环境变量中添加JDK主目录 ...

  8. QWT中Qdial的入门介绍

    最近使用了一下QWT.因为是第一次使用,所以有一些需要注意的地方,特记录在此,以供后来者参考. 1,QWT的安装与配置环境 有关QWT的安装与配置,网络上已经有很多篇文章,这里就不再重复了.介绍一下自 ...

  9. Spring入门介绍:

    Spring入门介绍 Spring诞生: 创建Spring的目的就是用来替代更加重量级的的企业级Java技术 简化Java的开发 基于POJO轻量级和最小侵入式开发 通过依赖注入和面向接口实现松耦合 ...

最新文章

  1. gdb调试问题Missing separate debuginfos, use: debuginfo-install
  2. 《R语言与数据挖掘最佳实践和经典案例》—— 第3章 数 据 探 索
  3. 2020年PMCAFF大咖分享合集(有回放)
  4. Linux配置keepalived实现nginx高可用安装过程记录
  5. c语言自动生成球队名称,C语言实现队(循环队列)
  6. [css] 说说你对table-layout的理解,它有什么运用场景?
  7. isvisible java_.NET(C#) Selenium操作调用浏览器判断页面元素(ElementIsVisible)可见的方法...
  8. 计算机进程调度论文,计算机操作系统小论文Linux进程调度.doc
  9. TensorFlow学习笔记01:TensorFlow入门
  10. 米斯特白帽培训讲义(v2)信息收集
  11. 双非二本院校,北京211,字节跳动 → 一个新秀的六年
  12. 振动噪声测试分析软件,DASP-V11工程版 振动噪声应变冲击
  13. 博弈论概述 (转自百度百科)
  14. cfd计算机模拟,cfd模拟(cfd模拟软件)
  15. Plugin For KanColleViewer – Provissy Tools V1.0
  16. 三年级下册计算机知识点,【北师大】三年级下册语文各单元知识点归纳
  17. 二元二次方程例题_二元二次方程组 解法 例题精编版
  18. 解决百度地图加载大量点卡顿
  19. 华硕Fonepad 8、MeMO Pad 7以及MeMO Pad 8也随之登场
  20. 点云转深度图:转化,保存,可视化

热门文章

  1. 新技术之金融行业区块链技术应用有了“安全符”
  2. 增速放缓、用户停滞,陌陌的未来不靠直播靠什么?
  3. 【数据清洗】python 实现数据分裂
  4. 如何实现异地远程登录计算机,第18期分享:人在异地,如何远程控制自己的电脑?...
  5. 干货丨时序数据库DolphinDB客户端软件教程
  6. 写一段程序来随机播放10首歌曲,要求不能重复。
  7. 学术书籍阅读的方法与价值
  8. 四大组件---ContentResolver
  9. ptyhon 学习练习题 2021-1-5
  10. dicom文件如何转换,通过RadAntDICOMViewer