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 ...
随机推荐
- Eclipse插件收集
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: [在Eclipse文件列表中打开文件所在 ...
- 关于Java线程意外退出自动重启..
最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停2秒.一切都像想象中的辣么美好.可是在后面的测试中发现收不到推送的消息了,接着发现了原来推送的线程由 ...
- 【解题报告】BZOJ2550: [Ctsc2004]公式编辑器
题意:给定一个可视化计算器的操作序列,包括插入数字.字母.运算符.分数.矩阵以及移动光标.矩阵插入行.插入列,输出操作序列结束后的屏显(数学输出). 解法:这题既可以用来提升OI/ACM写大代码模拟题 ...
- ant 的详细的入门教程
Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作. 一. ...
- nginx切割日志
#!/bin/bash ## Nginx 日志文件所在的目录 LOGS_PATH=/usr/local/nginx/logs ## 获取昨天的 yyyy-MM-dd YESTERDAY=$(date ...
- MyEclipse调用Matlab打包函数
本文部分内容参考了http://www.360doc.com/content/15/1103/16/1180274_510463048.shtml 一.检查Java环境 对于已经装上JAVA环境的计算 ...
- Linux内核--网络栈实现分析(七)--数据包的传递过程(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...
- 初识selenium--百度实例录制
Selenium 是一个web的自动化测试工具,不少学习功能自动化的朋友首选的就是Selenium,它相比QTP有许多优点(QTP笔者由于种种原因暂未使用过O(∩_∩)O哈!): ①Selenium是 ...
- spring核心框架体系结构
很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下 ...
- ASP.NET 4.5.256 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.5.256 in order for your site to run correctly
Microsoft .NET Framework 4.6安装后,用户可能会在使用Microsoft Visual Studio 创建(或打开现有项目时)网站.或Windows Azure项目时遇到下面 ...