Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控
3. 计算监控
1.使用计算监控
如果你有一个监控的属性firstName
和另一个lastName
,但你想显示全名怎么办? 这就是引入计算监控的原因-这是依赖于一个或多个其他的observables函数,无论这些依赖对象什么时候发生改变,它都将自动更新。
例如,下面给了一个view model 类,
function AppViewModel() {
this.firstName = ko.observable('Bob');
this.lastName = ko.observable('Smith');
}
您可以添加一个computed observable来返回全名:
function AppViewModel() {
this.firstName = ko.observable('Bob');
this.lastName = ko.observable('Smith');
// ... 保留firstName和lastName不变 ...
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
现在你可以绑定到UI元素,例如:
The name is <span data-bind="text: fullName"></span>
每当firstName
或lastName
的值更改时,它们都将更新(其任何依赖项发生更改时,都会调用你的求值函数,并且您返回的任何值都将传递给监控者,例如UI元素或其他计算监控)。
1. 依赖链如何工作
当然,如果你愿意,你可以创建整个计算监控的链。例如,您可能有:
- 一个监控对象叫做
items
表示一个集合 - 另一个监控对象叫做
selectedIndexes
存储用户选择集合某一项的索引值 - 一个计算监控叫做
selectedItems
以数组的形式返回选中的对象集合 - 另一个计算监控根据
selectedItems
里是否有选择项返回true
或false
(就像是空的或者未保存)。一些UI元素,比如按钮,可能根据这个值来判断按钮是否可用。
对items
或selectedIndexes
的更改将波及到计算监控的链,这反过来会更新绑定到它们的UI元素。
2. 管理this对象
ko.computed的第二个参数(我们在上面的例子中传递this的位置)在执行计算监控时定义了它的值。如果没有传递它,它不可能引用this.firstName()
或this.lastName()
。经验丰富的JavaScript编程人员会认为这是显而易见的,但如果你仅仅了解JavaScript,它可能看起来很奇怪。(像C#和Java这样的语言从来不希望程序员可以为this
设置一个值,但是JavaScript可以,因为它的函数本身在默认情况不是任何对象的一部分。)
一种流行的处理方式
有一个流行的约定,避免了总是需要跟踪this:如果你的viewmodel的构造函数将this赋值到一个不同的变量(通常叫做self
),然后在你的viewmodel里可以使用self
,而不必担心this被重新定义以指代别的东西。 例如:
function AppViewModel() {
var self = this;
self.firstName = ko.observable('Bob');
self.lastName = ko.observable('Smith');
self.fullName = ko.computed(function() {
return self.firstName() + " " + self.lastName();
});
}
因为self
在函数闭包中捕获,所以它在任何嵌套函数(例如在计算监控中的求值程序)中保持可用和一致。当涉及到事件处理程序时,这个约定甚至更有用,你将在许多在线实例中看到。
3. 纯计算监控
如果你想简单地计算并返回一个基于一些监控依赖的值,那么最好将其声明为ko.pureComputed
而不是ko.computed
。 例如:
this.fullName = ko.pureComputed(function() {
return this.firstName() + " " + this.lastName();
}, this);
由于这个计算被声明为纯的(即,执行器不直接修改其他对象或状态),KO可以更有效地管理其重新评估和内存使用。如果没有其他代码对它有活动依赖,Knockout将自动挂起或释放它。
4. 强制计算监控总是通知订阅者
当一个computed observable返回一个原始值(一个数字,字符串,布尔,或null),依赖监控通常只有在值实际改变时才进行通知。但是,可以使用内置notify extender
来确保computed observable的订阅者总是在更新时通知,即使该值是相同的。 您可以这样使用扩展器:
myViewModel.fullName = ko.pureComputed(function() {
return myViewModel.firstName() + " " + myViewModel.lastName();
}).extend({ notify: 'always' });
5. 延迟或阻止更改通知
通常情况下,一个计算监控对象只要发生改变就会立即通知订阅者。但是一个计算监控对象有很多依赖或触发一直更新,代价会很大,通过限制或延迟监控到的更改通知,可以获得更好的性能。可以使用频率限制扩展器来完成,如下:
// 确保每50毫秒内通知改变不超过一次
myViewModel.fullName.extend({ rateLimit: 50 });
6. 确定属性是否应是计算监控值
在某些情况下,以程序的方式确定某个属性是否是计算监控对象是很有用的。 KO提供了一个工具函数,ko.isComputed
来帮助处理这种情况。例如,您可能希望从返回服务器的数据中排除计算监控值。
for (var prop in myObject) {
if (myObject.hasOwnProperty(prop)&&!ko.isComputed(myObject[prop])) {
result[prop] = myObject[prop];
}
}
此外,KO提供了类似的功能,可以操作监控和计算监控:
- ko.isObservable - 对于监控对象,监控数组和所有计算监控对象返回true。
- ko.isWritableObservable - 对于监控对象,监控数组和可写计算监控(也称为
ko.isWriteableObservable
)返回true。
7. 当计算监控值仅在您的UI中使用
如果你只需要在UI中使用组合全名,你可以声明它:
function AppViewModel() {
// ... 保留firstName和lastName...
this.fullName = function() {
return this.firstName() + " " + this.lastName();
};
}
现在你绑定的UI元素变成方法调用,比如:
The name is <span data-bind="text: fullName()"></span>
KO将在内部创建一个计算监控,以便检测该监控表达式的依赖,并且在关联的元素在后面移除的时候自动释放它。
Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控的更多相关文章
- Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性
4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...
- Knockout v3.4.0 中文版教程-16-控制流-foreach绑定
2. 控制流 1. foreach绑定 目的 foreach绑定会遍历一个数组,为每个数组项生成重复的元素标记结构并做关联.这在渲染列表或表格的时候特别有用. 假设你的数组是一个监控数组,之后无论你进 ...
- Knockout v3.4.0 中文版教程-1-入门和安装
英文原版教程:http://knockoutjs.com/documentation/introduction.html 注:此教程根据英文原版翻译,仅作练习,如有不足或错误,请指正 说明: 对原文中 ...
- Knockout v3.4.0 中文版教程-9-计算监控-API参考
5.参考 下面的内容描述了如何构建和使用计算监控. 1. 构建一个计算监控 可以用如下的形式构建一个计算监控: ko.computed( evaluator [, targetObject, opti ...
- Knockout v3.4.0 中文版教程-7-计算监控-依赖跟踪如何工作
3.依赖跟踪如何工作 初学者不需要知道这一点,但更高级的开发人员将想知道为我们怎么实现KO自动跟踪依赖性和自动更新UI的正确部分... 它其实相当简单优雅,跟踪算法如下: 当你定义一个计算监控,KO立 ...
- Knockout v3.4.0 中文版教程-2-监控-通过监控创建视图模型(上)
2. 监控 1.通过监控创建视图模型 1. 监控 Knockout是基于以下三个核心特性: 监控和依赖跟踪 声明式绑定 模板 在本节,你将第一次了解这三个特性,在这之前,我们先来了解以下MVVM模式和 ...
- Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
2.可写的计算监控 初学者可能想要跳过本节 - 可写的计算监控是相当高级的部分,在大多数情况下不是必需的. 通常,计算监控是一个通过其他监控值计算出的值,因此是只读的. 令人惊讶的是,可以使计算监控值 ...
- Knockout v3.4.0 中文版教程-14-控制文本内容和外观-style绑定
5. style绑定 目的 style绑定用来给关联的DOM元素添加或移除一个或多个样式值.在如下情况很有用,比如,当某些值为负时,高亮显示,或者设置容器元素的宽度来匹配数值的改变. (注意:如果你不 ...
- Knockout v3.4.0 中文版教程-13-控制文本内容和外观-css绑定
4. css绑定 目的 css绑定可以给关联的DOM元素添加或移除一个或多个CSS类.该绑定很有用,比如,当一些值为负数时高亮这些值为红色. (注意:如果你不想使用一个CSS类选择器来附加样式而想直接 ...
随机推荐
- 关于@Mapper和@Repository的一点小理解
参考博客:https://blog.csdn.net/lalioCAT/article/details/51803461 如果在接口上@Mapper,然后再在 xml中的namespace指向mapp ...
- PHP使用Socket发送字节流
例如,需要发送以下数据 struct header { int type; // 消息类型 int length; // 消息长度 } struct MSG_Q2R2DB_PAYRESULT { ...
- 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比
HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...
- 解决win64无法添加curl扩展的问题
网上试了很多方法都无效,最后直接用phpstudy集成安装包中对应版本的php_curl.dll替换即可
- FreeMusic项目优化(一)——flex布局学习记录
参考博客:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html flex布局是w3c于09年提出的,用于简便,整洁,响应式地解决布局问题的手 ...
- Android ScrollView嵌套RecyclerView导致在三星s8曲面屏显示不全问题
当RecyclerView适配显示不全时可以单独给其嵌套一个相对布局!!!(必须是相对布局),这样在曲面屏手机就可以全部显示出来如下图所示 <RelativeLayout android:lay ...
- ARM指令解析
今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/ ...
- [windows]桌面中添加我的电脑,我的文档和网上邻居图标
xp系统: 操作步骤:桌面任意位置--〉右键--〉属性--〉桌面选项卡--〉自定义桌面--〉常规:勾选相关图标确定即可. win7系统: 操作步骤:桌面任意位置--〉右键--〉个性化--〉(右侧)更改 ...
- svn merge当主干修改后合并分支
例如版本r1的主干创建分支r2,在r2上修改后得到r3,r1之后也修改得到r4,现在合并分支到主干上: 如果r3的修改和r4有冲突会提示出现冲突,因此不用担心主干合并后会被分支操作覆盖,因为这并不是简 ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...