本节主要涉及到3个内容:

1. 监控属性 Observables

(这个用的比较多,但是其本身使用比较简单,唯一需要注意就是,它监控的对象是一个方法,所以取值和设置值的时候容易混淆)

2. 计算属性  Computed Observable

(这个在新增计算列,或者对字段属性值的读写进行验证、转换时特别有用)

3. 监控属性数组 Observable Arrays

(这个用的较少,一开始不需要太深入,毕竟直接绑定数组进行简单显示的情况不多)

下面分别简单介绍一下各自的用法。

1. 监控属性Observables

KO最重要的一个属性就是当View Model发生变化时能够自动的更新UI界面。KO是如何能够知道你的View Model已经发生改变了呢?答案是:你需要将你的model属性声明成observable的, 因为它是非常特殊的JavaScript 对象,能够通知用户它的改变以及自动检测依赖关系。

例如:重写上节例子中的View Model为以下代码:

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

你根本不需要对View进行更改,所有的data-bind语法依然正常工作。所不同的是,现在它能够自动检测变化,并通知它自动更新界面(View)。

Reading and writing observables  -  关于监控属性的读写操作

关于监控属性本身使用比较简单,唯一需要注意的是,为了兼容IE,它监控的对象都是方法,所以在取值和设置值需要注意下,刚开始使用时往往会忽略这点。

并不是所有的浏览器都支持JavaScript的getters and setters (比如IE),所以,为了兼容,ko.observable监控的对象都是方法。

1、读取当前监控的属性值,只需要直接调用observable(不需要参数),在这个例子当中,调用myViewModel.personName()将会返回'Bob',调用myViewModel.personAge() 将会返回'123'

2、写一个新值到监控属性上,调用observable方法,将要写的值作为一个参数传入即可。例如,调用myViewModel.personName('Mary') 将会把名称改变成 'Mary'。

3、一次性改变Model对象监控的多个属性值,你可以使用链式方法。例如:myViewModel.personName('Mary').personAge(50) 将会把名称改变成'Mary'将年龄设置为 .

监控属性最重要的一点就是可以随时监控,也就是说,其他代码可以告诉它哪些是需要通知发生变化的。这就是为什么KO会有如此多的内置绑定语法。所以,当你在页面中编写data-bind="text: personName",text 会绑定注册到自身,当personName发生变化时,它能够立即得到通知。

当你通过调用 myViewModel.personName('Mary') 将名称的值改变成为'Mary'时,text绑定会自动更新新值到其对应的DOM对象元素上,这就是为什么改变数据模型能够自动刷新View页面。

2. 计算属性  Computed Observable

如果你已经有了一个监控属性 firstName和lastName,如果你想显示全名该怎么做呢?这个时候你就可以通过计算属性来实现,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变他们就会跟着改变。

例如,下面的 view model:

  1. function AppViewModel() {
  2. this.firstName = ko.observable('Bob');
  3. this.lastName = ko.observable('Smith');
  4. }

你可以添加一个计算属性来返回全名,例如:

  1. function AppViewModel() {
  2. // ... leave firstName and lastName unchanged ...
  3.  
  4. this.fullName = ko.computed(function() {
  5. return this.firstName() + " " + this.lastName();
  6. }, this);
  7. }

下面你就可以将它绑定到UI对象上了,如:

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

当firstName或者lastName 变化,它将会随时更新(当依赖关系发生变化,你的计算函数就会被调用,并且它的值都会更新到UI对象或其他的依赖属性上去)。

关于计算属性的读和写

计算属性通常情况下是只读的,你可能会比较惊讶,怎么可能让计算属性变的可写。你仅仅只需要提供一个回调函数来实现值的写入。

然后你可以把这个可写的计算属性当成一个普通的监控属性来使用,通过你自定义的逻辑来实现它的读和写。这个强大的功能可以拓宽我们对KO的使用范围,你可以通过链式语法在一个View Model上传入多个监控属性或者计算属性,例如:

  1. myViewModel.fullName('Joe Smith').age()

下面介绍几使用个例子,

示例一:分解用户输入

  1. function MyViewModel() {
  2. this.firstName = ko.observable('Planet');
  3. this.lastName = ko.observable('Earth');
  4.  
  5. this.fullName = ko.computed({
  6. read: function () {
  7. return this.firstName() + " " + this.lastName();
  8. },
  9. write: function (value) {
  10. var lastSpacePos = value.lastIndexOf(" ");
  11. if (lastSpacePos > ) { // Ignore values with no space character
  12. this.firstName(value.substring(, lastSpacePos)); // Update "firstName"
  13. this.lastName(value.substring(lastSpacePos + )); // Update "lastName"
  14. }
  15. },
  16. owner: this
  17. });
  18. }
  19.  
  20. ko.applyBindings(new MyViewModel());

示例二:值转换

  1. function MyViewModel() {
  2. this.price = ko.observable(25.99);
  3.  
  4. this.formattedPrice = ko.computed({
  5. read: function () {
  6. return '$' + this.price().toFixed();
  7. },
  8. write: function (value) {
  9. // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable
  10. value = parseFloat(value.replace(/[^\.\d]/g, ""));
  11. this.price(isNaN(value) ? : value); // Write to underlying storage
  12. },
  13. owner: this
  14. });
  15. }
  16.  
  17. ko.applyBindings(new MyViewModel());

示例三:筛选和验证用户输入

  1. function MyViewModel() {
  2. this.acceptedNumericValue = ko.observable();
  3. this.lastInputWasValid = ko.observable(true);
  4.  
  5. this.attemptedValue = ko.computed({
  6. read: this.acceptedNumericValue,
  7. write: function (value) {
  8. if (isNaN(value))
  9. this.lastInputWasValid(false);
  10. else {
  11. this.lastInputWasValid(true);
  12. this.acceptedNumericValue(value); // Write to underlying storage
  13. }
  14. },
  15. owner: this
  16. });
  17. }
  18.  
  19. ko.applyBindings(new MyViewModel());

3. 监控属性数组 Observable Arrays

如果你想发现并响应一个对象的改变,就应该用监控属性(observables)。如果你想发现并响应一个集合的变化,就该用监控属性数组(observableArray)。监控属性数组在 显示或编辑多个值 以及 对界面的一部分重复显示或隐藏(如添加删除条目)等多种情况下 都是很有用的。

如果我们想要使用Knockoutjs表示多个值的话我们可以使用数组监控(Observable Arrays)来表示,形式如下:

  1. var myObservableArray = ko.observableArray();
  2. myObservableArray.push('Some value');

在第一行我们实例化了一个数组,在第二行我们向此数组中添加了一条记录,正如我们看到的那样,往数组中添加数组我们使用push方法。当然我们也可以在初始化数组的时候为其赋初值,代码如下:

  1. var anotherObservableArray = ko.observableArray([ {
  2. name: "Bungle", type: "Bear" }, {
  3. name: "George", type: "Hippo" }, {
  4. name: "Zippy", type: "Unknown" } ]);

最后附上 Knockoutjs 数组常用的方法如下:

(1)、myObservableArray.push('Some new value'):增加一个新的元素

(2)、myObservableArray.pop():删除一个元素,并返回其值

(3)、myObservableArray.unshift('Some new value'):在数组的开始处增加一个新的元素

(4)、myObservableArray.shift():删除数组的第一个元素,并返回其值

(5)、myObservableArray.reverse():反转数组的顺序

(6)、myObservableArray.sort():数组排序。排序规则可以由用户自己定义也可以使用默认,默认情况下按照字母顺序或者数字的顺序进行排序。自己定义排序规则时需要接收数组 中的两个元素,并且需要返回一个数值,当此值小于0时表示第一个元素较小,当此值大于0时,表示第二个元素较小,当等于0时表示两个元素相等。

(7)、myObservableArray.splice():数组截取。例如:myObservableArray.splice(1, 3),代表从数组的第一个元素开始,截取三个元素,并且将他们作为数组返回。

KnockoutJS(2)-监控属性的更多相关文章

  1. KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性

    计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...

  2. knockoutJS学习笔记04:监控属性

    一.语法介绍 先来看一个简单的例子: <span data-bind="text:name"></span> var obj = {name:ko.obse ...

  3. KnockoutJS 3.X API 第二章 数据监控(2)监控属性数组

    监控属性数组 如果要对一个对象检测和响应变化,会使用监控属性.如果要对一个序列检测并监控变化,需要使用observableArray(监控属性数组).这在你显示或编辑多个值,需要用户界面的部分反复出现 ...

  4. KnockoutJS 3.X API 第三章 计算监控属性(2) 可赋值的计算监控属性

    .liveexample{ padding: 1em; background-color: #eeeedd; border: 1px solid #ccc; max-width: 655px; fon ...

  5. KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪

    KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...

  6. KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables

    Pure computed observables Pure computed observables是KO在3.2.0版本中推出的.她相对于之前的ComputedObservables有很多改进: ...

  7. KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册

    计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...

  8. 监控属性数组(Observables Arrays )

    如果你想发现并响应一个对象的改变,就应该用监控属性(observables).如果你想发现并响应一个集合的变化,就该用监控属性数组 (observableArray).监控属性数组在显示或编辑多个值以 ...

  9. Knockout 新版应用开发教程之创建view models与监控属性

    最近抽出点时间研究MVVM,包括司徒正美的avalon,google的angular,以及Knockout,博客园Tom的Knockout指南 时隔2年了,ko更新了不少,所以文档也相应的变化了,所以 ...

随机推荐

  1. mac 功能修改。。。。

    个人表示 Mac 下的 Spotlight 搜索功能确实是个鸡肋,安装 QuickSilver 才是王道!所以我个人就把 Spotlight 关闭掉了.方法很简单,还是要用到 “终端” 工具. 在 “ ...

  2. PYTHON 源码阅读

    http://www.wklken.me/posts/2015/09/29/python-source-gc.html http://www.wklken.me/archives.html https ...

  3. IOS 小技巧积累

    转自:http://blog.csdn.net/mars2639/article/details/7352012 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在 ...

  4. oracle_partition sample

    (1.) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢 ...

  5. cocos2d-x回收池原理

    cocos2d-x源于cocos2d-iphone,为了与Objective-c一致,cocos2d-x也采用了引用计数与自动回收的内存管理机制. 要现实自动内存回收,需继承于cocos2d-x的根类 ...

  6. Java(Android)编程思想笔记01:多态性的理解

    1. 多态的定义: 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. (发送消息就是函数调用)   2. 多态的理解    多态是面向对象的重要特性,简 ...

  7. JavaScript 关于this的理解

    this是一个挺神奇的东西,经常不知道它绑定到了那里 ,因此出来了各种绞尽脑汁的面试题. 例1 <script> var person={}; person.name='li'; pers ...

  8. python(1) - 变量小测试

    下面看一道题目: a = 3 b = a a = 5 print(a,b) 程序最后输出的a,b值分别是多少呢? 先想一想,然后我们执行一下看看正确答案: 正确答案 a 的值是5, b的值是3,为什么 ...

  9. phpnow升级php版本 php-5.2.14-Win32升级至5.3.5

    PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22.下面来升级PHP5.3.5: 1.下载安装文件: 先下载PHP5.3.5,下载地址:php-5.3.5-Win32-V ...

  10. codevs4373 窗口==poj2823 Sliding Window

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 53676   Accepted: 15399 ...