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 ...
随机推荐
- Tomcat部署遇到的问题
项目服务端:Tomcat6.0.41 选用数据库:Mysql5.6.17 JDK环境:1.6.37 运行系统:Windows server 2008(64bit) ================== ...
- hdu 1166 敌兵布阵(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始 ...
- 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
1.概念介绍 如果你拥有一个开发者账户的话,在iOS Dev Center打开Certificates, Indentifiers & Profiles,你就可以看到如下的列表: Profil ...
- iOS开发零基础--Swift教程 字典
字典的介绍 字典允许按照某个键来访问元素 字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)集合 键集合是不能有重复元素的,而值集合是可以重复的,键和值是成对出现的 Swift中 ...
- 第54讲:Scala中复合类型实战详解
今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...
- AutoLayout - VFL
其实很早就像整理出一份VFL的总结出来,觉得有很多东西可以写,但是真正去总结的时候发现,VFL也并没有很多东西,其实应该是在布局的过程中直接用VFL语句思考的过程比较难以形成,多数布局问题其实是在实际 ...
- 解决 504 Gateway Time-out和502 Bad Gateway(nginx)
504 Gateway Time-out 问题所在: 所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓 ...
- Oracle Created Database Users: Password, Usage and Files References (文档 ID 160861.1)
This document is no longer actively maintained, for info on specific (new) users in recent product e ...
- cuda计算的分块
gpu的架构分为streaming multiprocessors 每个streaming multiprocessors(SM)又能分步骤执行很多threads,单个SM内部能同时执行的thread ...
- php+redis window
http://download.csdn.net/detail/qwfy326/6572443 wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64