KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控
数据监控
KO的三个内置核心功能:
- 监控(Observable)和依赖性跟踪(dependency tracking)
- 声明绑定(Declarative bindings)
- 模板(Templating)
在这个页面上,您将了解三种核心功能的第一种。但在此之前,让我们来看看MVVM模式的概念和视图模型的概念。
MVVM模式和视图模型
模型-视图-视图模型(MVVM)是用于构建用户界面的设计模式。它描述了如何将复杂的UI分割成三个部分:
- 模型:应用程序所存储的数据。这个数据代表了你的业务领域对象和操作(例如,可以进行资金转账的银行账户),并独立于任何用户界面。当使用KO,通常会用Ajax调用一些服务器端API将数据读取和写入此存储模型。
- 视图模型:可理解为UI上的数据呈现和操作后的数据暂存的表示。例如,如果你查看一个列表,视图模型将一系列的数据展示并暴露相关操作(添加和删除项目)的方法。
需要注意的是,视图模型并不参与UI的呈现方式:它不具有按钮或显示样式的任何概念。不是持久化数据模型,它是用户正在查看或未保存的数据。当使用KO,你的视图模型是纯JavaScript对象。
- 视图:代表MVVM模式状态的可见部分,用户的互动界面。它显示从视图模型的信息,发送命令到视图模型(例如,当用户点击按钮)。
当使用KO,视图是简单地声明绑定到其视图模型的HTML文档。另外,也可以使用视图模型的数据生成HTML模板。
要创建具有KO视图模型,只是声明任何JavaScript对象。例如:
var myViewModel = {
personName: 'Bob',
personAge: 123
};
然后,您可以创建一个非常简单的视图使用声明绑定这一观点模型。例如,下面的标记显示personName值:
The name is <span data-bind="text: personName"></span>
激活KO的绑定关系
该data-bind属性不属于HTML的基础元素属性,但是还是可以正常运行的。但由于浏览器不知道这意味着什么,你需要激活KO的绑定关系,使之生效。
要激活KO的绑定关系,在<script>模块中添加一行代码:
ko.applyBindings(myViewModel);
您可以把脚本写在HTML文档的底部,或者你可以把它写在HTML文档顶部并在文档的DOM就绪后处理,如使用jQuery的$功能。
这就行了!现在,您的视图将显示写下面的HTML:
The name is <span>Bob</span>
ko.applyBindings的参数
第一个参数是要高数KO,你要绑定的视图模型是那个。
你可以传递第二个参数是定义要搜索该文档的那一部分data-bind属性。例如,ko.applyBindings(myViewModel, document.getElementById('someElementId'))。这限制激活绑定视图模型的范围在HTML元素的ID元素为someElementId及其子元素,如果你想有多个视图模型的激活绑定或者每个页面的不同区域进行模型绑定的话这种方式是很有用的。
监控(Observable)
OK,你已经看到了如何创建一个基本视图模型以及如何显示绑定的属性。但是KO的主要好处是,它会根据视图模型变化自动更新你的UI。KO如何知道什么时候您的视图模型的一部分改变的呢?答案就是你需要为你的视图模型设置observable(监控),这是特殊的JavaScript对象,可将变更通知用户,并能自动检测依赖关系。
例如,改写前面的视图模型对象,如下所示:
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
当视图模型属性值发生变化时,会自动更新UI中的data-bind的绑定属性。同理UI中绑定属性发生变化时也会自动同步到视图模型中。
读写监控属性
- 要读取监控属性的当前值,只需调用视图模型属性的无参数方法。在这个例子中,myViewModel.personName()将返回'Bob',myViewModel.personAge()返回123。
- 为了赋值一个新值到监控属性,只需要调用视图模型属性的有参数方法,将值作为参数传递。例如,调用myViewModel.personName('Mary')将更改名称值'Mary'。
- 将值写入多个监控属性的模型对象,你可以使用链式语法。例如,myViewModel.personName('Mary').personAge(50)将更改名称值和年龄值为'Mary' 50
KO将可以监控监控属性,当你写data-bind="text: personName"时,text结合自身注册时得到通知personName的变化。
当您更改名称值'Mary'调用myViewModel.personName('Mary')时,text绑定会自动更新相关的DOM元素的文本内容。
声明监控
你通常需要手动设置订阅,所以初学者应该跳过这一节。
对于高级用户,如果你想注册自己的订阅通知的变化监控,你可以调用subscribe函数。例如:
myViewModel.personName.subscribe(function(newValue) {
alert("The person's new name is " + newValue);
});
该subscribe函数是KO内部函数。大多数时候,你不需要用这个,因为内置的绑定和模板系统管理监控已经够用了。
该subscribe函数接受三个参数:callback是每当发生通知被调用的函数,target(可选)定义的值this的回调函数,event(可选,默认为"change")是事件接收通知的名称。
您也可以终止订阅,可以调用dispose函数,例如:
var subscription = myViewModel.personName.subscribe(function(newValue) { /* do stuff */ });
// ...then later...
subscription.dispose(); // I no longer want notifications
如果你想在监控发生之前执行相关业务,可以使用beforeChange事件。例如:
myViewModel.personName.subscribe(function(oldValue) {
alert("The person's previous name is " + oldValue);
}, null, "beforeChange");
强行监控属性实时通知用户
当赋值一个包含原始值(一个数字,字符串,布尔值,或者为null)监控属性,使用内置的notified ,以确保一个观测监控属性的用户总是得到通知,即使该值是相同的。
myViewModel.personName.extend({ notify: 'always' });
延缓或抑制更改通知
通常情况下,监控属性值改变会立即通知其用户。但是,如果一个监控属性频繁更新会带来高昂的数据传输代价,你可以通过限制或延迟变更通知获得更好的性能。这是通过使用rateLimit增量实现:
// Ensure it notifies about changes no more than once per 50-millisecond period
myViewModel.personName.extend({ rateLimit: 50 });
KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控的更多相关文章
- KnockoutJS 3.X API 第二章 数据监控(2)监控属性数组
监控属性数组 如果要对一个对象检测和响应变化,会使用监控属性.如果要对一个序列检测并监控变化,需要使用observableArray(监控属性数组).这在你显示或编辑多个值,需要用户界面的部分反复出现 ...
- Knockout v3.4.0 中文版教程-2-监控-通过监控创建视图模型(上)
2. 监控 1.通过监控创建视图模型 1. 监控 Knockout是基于以下三个核心特性: 监控和依赖跟踪 声明式绑定 模板 在本节,你将第一次了解这三个特性,在这之前,我们先来了解以下MVVM模式和 ...
- KnockoutJS 3.X API 第一章 简介
本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...
- 【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU
从本节开始我们就进入到本章的最后一节内容了,也就是我们算术逻辑单元的它的实现.这部分呢是数字电路的一些知识,所以呢,如果你没有学过数字电路的话,也不要慌张,我会从基础开始给大家补起.那么在计算机当中, ...
- MyBatis从入门到精通:第二章数据的创建与插入文件
数据库表的创建: create table sys_user ( id bigint not null auto_increment, ), user_password ), user_email ) ...
- Knockout v3.4.0 中文版教程-3-监控-通过监控创建视图模型(下)
6. 显式订阅监控 你通常不需要手动设置订阅,所以初学者应该跳过这一节. 对于高级用户,如果你想注册自己的订阅来监控通知变化,你可以使用 subscribe函数,比如: myViewModel.per ...
- KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性
计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...
- ASM学习笔记--ASM 4 user guide 第二章要点翻译总结
参考:ASM 4 user guide 第一部分 core API 第二章 类 2.1.1概观 编译后的类包括: l 一个描述部分:包括修饰语(比如public或private).名字.父类.接口 ...
- KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...
随机推荐
- Github 新的项目管理模式——Projects
Github 新的项目管理模式--Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进行的,这部分内容不是本文重点,不再赘述. 但有一些功 ...
- 『TCP/IP详解——卷一:协议』读书笔记——17
2013-08-27 15:37:42 6.5 ICMP端口不可达差错 端口不可达报文是ICMP差错报文的一种,它是ICMP不可达报文中的一种,以此来看一看ICMP差错报文中所附加的信息.使用UDP来 ...
- 关于 某编译错误: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
每次当八月在VS2013里使用strcat的时候,基本上都会出现这个问题╮(╯▽╰)╭ 原因貌似是因为安全问题(⊙o⊙) 于是,解决方法如下: ①更改预处理定义: (这也是八月最常用的方法了,虽然貌似 ...
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法
错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析: 此错误发 ...
- dom4j解析xml的增加信息
想要在xml中增加信息,那么就要先找到你要加信息的节点 前三行是固定模式,主要是找到xml文件的地址,并且得到根节点,再从根节点中便利出来movie的所有节点之后用集合接收 SAXReader rea ...
- Python-变量
1.Python的变量是什么 变量是用来存储计算机程序中的信息,唯一的目的是将数据存储在内存中. 2.Python变量的组成 变量由字母.数字.下划线组成: 变量的第一位不能是数字,可以是字母或下划线 ...
- 多线程NSInvocationOperation(NSOperationQueue)的基本用法
#import "ViewController.h" @interface ViewController () @end @implementation ViewContr ...
- html+css+javascript实现简易轮播图片
html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <lin ...
- 《利用Python进行数据分析》第6章学习笔记
数据加载.存储与文件格式 读写文本格式的数据 逐块读取文本文件 read_xsv参数nrows=x 要逐块读取文件,需要设置chunksize(行数),返回一个TextParser对象. 还有一个ge ...
- unity如何显示血条(不使用NGUI)
用unity本身自带的功能,如何显示血条? 显示血条,从资源最小化的角度,只要把一个像素的色点放大成一个矩形就足够,三个不同颜色的矩形,分别显示前景色,背景色,填充色,这样会消耗最少的显存资源. un ...