KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控

数据监控

KO的三个内置核心功能:

  1. 监控(Observable)和依赖性跟踪(dependency tracking)
  2. 声明绑定(Declarative bindings)
  3. 模板(Templating)

在这个页面上,您将了解三种核心功能的第一种。但在此之前,让我们来看看MVVM模式的概念和视图模型的概念

MVVM模式和视图模型

模型-视图-视图模型(MVVM)是用于构建用户界面的设计模式。它描述了如何将复杂的UI分割成三个部分:

  • 模型:应用程序所存储的数据。这个数据代表了你的业务领域对象和操作(例如,可以进行资金转账的银行账户),并独立于任何用户界面。当使用KO,通常会用Ajax调用一些服务器端API将数据读取和写入此存储模型。
  • 视图模型:可理解为UI上的数据呈现和操作后的数据暂存的表示。例如,如果你查看一个列表,视图模型将一系列的数据展示并暴露相关操作(添加和删除项目)的方法。

    需要注意的是,视图模型并不参与UI的呈现方式:它不具有按钮或显示样式的任何概念。不是持久化数据模型,它是用户正在查看或未保存的数据。当使用KO,你的视图模型是纯JavaScript对象。

  • 视图:代表MVVM模式状态的可见部分,用户的互动界面。它显示从视图模型的信息,发送命令到视图模型(例如,当用户点击按钮)。

    当使用KO,视图是简单地声明绑定到其视图模型的HTML文档。另外,也可以使用视图模型的数据生成HTML模板。

要创建具有KO视图模型,只是声明任何JavaScript对象。例如:

  1. var myViewModel = {
  2. ????personName: ‘Bob‘,
  3. ????personAge: 123
  4. };

然后,您可以创建一个非常简单的视图使用声明绑定这一观点模型。例如,下面的标记显示personName值:

  1. The name is <span
    data-bind="text: personName"></span>

激活KO的绑定关系

该data-bind属性不属于HTML的基础元素属性,但是还是可以正常运行的。但由于浏览器不知道这意味着什么,你需要激活KO的绑定关系,使之生效。

要激活KO的绑定关系,在<script>模块中添加一行代码:

  1. ko.applyBindings(myViewModel);

您可以把脚本写在HTML文档的底部,或者你可以把它写在HTML文档顶部并在文档的DOM就绪后处理,如使用jQuery的$功能。

这就行了!现在,您的视图将显示写下面的HTML:

  1. 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对象,可将变更通知用户,并能自动检测依赖关系。

例如,改写前面的视图模型对象,如下所示:

  1. var myViewModel = {
  2. ????personName: ko.observable(‘Bob‘),
  3. ????personAge: ko.observable(123)
  4. };

当视图模型属性值发生变化时,会自动更新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函数。例如:

  1. myViewModel.personName.subscribe(function(newValue) {
  2. ????alert("The person‘s new name is " + newValue);
  3. });

该subscribe函数是KO内部函数。大多数时候,你不需要用这个,因为内置的绑定和模板系统管理监控已经够用了。

该subscribe函数接受三个参数:callback是每当发生通知被调用的函数,target(可选)定义的值this的回调函数,event(可选,默认为"change")是事件接收通知的名称。

您也可以终止订阅,可以调用dispose函数,例如:

  1. var subscription = myViewModel.personName.subscribe(function(newValue) { /* do stuff */ });
  2. // ...then later...
  3. subscription.dispose(); // I no longer want notifications

如果你想在监控发生之前执行相关业务,可以使用beforeChange事件。例如:

  1. myViewModel.personName.subscribe(function(oldValue) {
  2. ????alert("The person‘s previous name is " + oldValue);
  3. }, null, "beforeChange");

强行监控属性实时通知用户

当赋值一个包含原始值(一个数字,字符串,布尔值,或者为null)监控属性,使用内置的notified?,以确保一个观测监控属性的用户总是得到通知,即使该值是相同的。

  1. myViewModel.personName.extend({ notify: ‘always‘ });

延缓和/或抑制更改通知

通常情况下,监控属性值改变会立即通知其用户。但是,如果一个监控属性频繁更新会带来高昂的数据传输代价,你可以通过限制或延迟变更通知获得更好的性能。这是通过使用rateLimit增量实现:

  1. // Ensure it notifies about changes no more than once per 50-millisecond period
  2. myViewModel.personName.extend({ rateLimit: 50 });

?

  1. 感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力。欢迎转载!
  2. ?
  3. 我的博客:http://www.cnblogs.com/smallprogram/

?

时间: 2024-11-10 16:15:38

KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控的相关文章

第二章 数据,变量和计算

头文件 #include <>或#include "" <> 强制类型转换 double a=1.6; cout<<static_cast<int>(a)<<endl; 输出为1 注意旧的强制类型转换为int(a),这比新的更容易出错,得不到想要的结果,所以推荐static_cast<转换成的类型>() 自动判断数据类型 auto n=16; 自动判断n的类型为int const auto e=1.1; 自动判断静

网页音频API 第二章

第二章 完美的时间模型和时延网页音频API比<audio>标签更强大的一处在于它有一个低延迟.精准的时间模型.对于游戏和交互式应用来说,低延迟是非常重要的,因为你通常需要非常快的用声音来响应用户操作.如果这个反馈不是即时的,用户会感觉到这个延迟,这是不让人满意的.实际上,由于人类听觉的缺陷,延迟的误差可高达20毫秒,不过这个数字还会随着很多其他的因素来改变.精准的时间模型使你能够把事件安排在未来特定的时间.这对用脚本控制(播放)的场景和音乐应用来说非常有用. 时间模型音频上下文的一个关键点在于

第二章 数据是用二进制表示的

看完第二章后,我知道了计算机是以二进制来存储数据的(其实标题已经告诉我们了).以至于计算机为什么用二进制来表示的,是因为计算机内部是由集成电路这种电子部件构成的,它们的所有引脚的每个引脚只有两种状态,就是0V和5V, 二进制数是只有0和1,它们之间的特性很相似. 还有字节(Byte)与位(bit)两者的关系,字节是计算机处理信息的基本单位,而位是最小单位(1字节=8位).还有就是用二进制数表示的数值,计算机不会区分它是数值.文字还是图片等,而是根据编写的各位对计算机发出的指示来进行信息的处理的.

【知识强化】第二章 数据的表示和运算 2.2 定点数的表示与运算

我们进入第二章的学习,就是定点数的表示和运算. 那关于定点数呢我们分为两块内容,一块呢就是定点数的表示也就是我们这一节的内容,一块呢就是定点数的运算.这两块内容呢都非常的难,也都非常的重点.希望大家呢引起重视. 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/11370240.html

高性能javascript(第二章 数据访问)

1.数据存储位置关系到访问速度.在 JavaScript 中有四种基本的数据访问位置: 直接量: 变量: 数组: 对象: 2.多数情况下,对一个直接量和一个局部变量数据访问的性能差异是微不足道的. 3.作用域和标示符解析: 每一个 JavaScript 函数都被表示为对象.进一步说,它是一个函数实例.函数对象正如其他对象那样, 拥有你可以编程访问的属性,和一系列不能被程序访问,仅供 JavaScript 引擎使用的内部属性. 其中一个内部属性是[[Scope]],由ECMA-262 标准第三版定

《数据挖掘:R语言实战》第二章 数据概览

2.1 n*m数据集 在n*m表格形式的数据集中,n代表数据的行,即观测点的数量:m代表列,即变量的数量:n*m为数据的维度. 一般来说,当拿到一份数据时,最先做的往往就是查看数据集的观测样本数.变量数,以及这些变量的实际含义,以此对数据集的庞大程度和各变量的相对重要性做到心中有数.这对选取何种数据挖掘算法,以及在这之前应该抽取多少及哪些变量及样本纳入建模都有重要的先导作用. 2.2 数据的分类 2.2.1 一般的数据分类 定量数据:连续型数据和离散型数据 定性数据:定类数据.定序数据.定距数据

第二章 数据的存储与检索(2)

重点: 知道何时读完文件:feof() 函数 每次读取一行数据:fgets() .fgetss() .fgetcsv() 函数 读取整个文件:readfile() .fpassthru() .file() 函数 读取一个字符:fgetc() 函数 读取任意长度:fread() 函数 查看文件是否存在:file_exists() 函数 确定文件大小:filesize() 函数 删除一个文件:unlink() 函数 在文件中定位:rewind() .fseek() .ftell() 函数 文件锁定:

第二章 数据的存储与检索(1)2.1—2.4节

学习重点: 保存数据以便后期使用 打开文件 创建并写入文件 关闭文件 读文件 给文件加锁 删除文件 其他有用的文件操作函数 数据库管理系统 存储和检索Bob的订单: html文件:文件名(orderform.html) <html> <head> <title>Bob's Auto Parts</title> </head> <body> <h1>Bob's Auto Parts</h1> <h2>

第二章 数据的储存与运算

在师兄的建议下换了本教材,从头开始学习,发现原来自己前面一个月学的真的是很浅(仅仅照着书打).以下是这个星期的几个典型错误: 1.自己习惯了数学的"省略乘号"思维,带到写程序中: 2.在运用除法时容易忽略"除法两边为整型数据时,结果取整舍小",造成误差,以后在使用除法时,要习惯用如图的表达: [本周小结]1.本周跟着视频学习,但是自己没有事先看书预习,造成自己在看视频上面花了较多时间,自己动手操作打代码的时间较少,下周可以先花两天时间阅读教材,打代码之后再看视频补充