Knockout v3.4.0 中文版教程-9-计算监控-API参考
5.参考
下面的内容描述了如何构建和使用计算监控。
1. 构建一个计算监控
可以用如下的形式构建一个计算监控:
- ko.computed( evaluator [, targetObject, options] ) — 这是最常见的构建计算监控的形式。
- evaluator — 一个用来计算当前计算监控值的函数
- targetObject — 如果提供该值,该值定义了当KO请求你的回调函数时函数内部
this的值。请看管理this章节查看更多信息。 - options — 一个包含计算监控特性属性设置的对象,下面有详细列表。
- ko.computed( options ) — 一个参数形式创建的计算监控接收一个javascript对象并包含如下属性。
- read - 必要属性。一个用于计算当前计算监控当前值的函数。
- write — 可选。如果有,计算监控变为可写。这是一个函数,接收其他代码想要写入计算监控的值。具体功能由你的自定义逻辑对传入值的处理,一般是把值传回底层依赖。
- owner — 可选。如果有,定义当KO请求你的
read或write函数时函数内部this的值。 - pure — 可选。如果选项为
true,计算监控会变为纯计算监控。该项可由ko.pureComputed来构造计算监控来替代。 - deferEvaluation —可选。如果该项为
true,计算监控的值不会进行求值,直到确实有某些代码访问它的值或手动订阅它。默认情况下,计算监控在构建之后立即进行求值。 - disposeWhen — 可选。如果选项为
true,该函数在每次重新求值之前执行,用于决定计算监控是否应该被释放。结果为true会触发释放所有计算监控。 - disposeWhenNodeIsRemoved — 可选。如果有,计算监控的释放会在规定的DOM节点被KO移除的时候触发。此功能是用来处理计算监控绑定节点,节点通过模板和控制流绑定删除时释放计算监控。
- ko.pureComputed( evaluator [, targetObject] ) — 用提供的求值函数和用来定义this的可选对象来构建纯计算监控。不像
ko.computed,此方法不接受可选参数。 - ko.pureComputed( options ) — 通过提供一个javascript对象来构建一个纯计算监控。对象接受
read,write,和owner选项如前面所述。
2. 使用计算监控
一个计算监控提供如下一些方法:
- dispose() —手动释放计算监控,清除所有依赖的订阅。如果你想停止正在刷新数据的计算监控或者清理由于存在依赖的监控而不能清理的计算监控的内存。
- extend(extenders) —给计算监控提供扩展器。
- getDependenciesCount() — 返回当前计算监控的依赖数量。
- getSubscriptionsCount( [event] ) — 返回计算监控当前订阅的数量(无论是来自计算监控还是手动订阅)。可选的,传入一个事件名(比如
change)会返回当前事件的订阅数量。 - isActive() — 返回计算监控的值在之后是否可能会被更新。如果计算监控没有依赖,会处于闲置状态。
- peek() —返回计算监控当前值并不创建依赖。
- subscribe( callback [,callbackTarget, event] ) — 注册一个手动订阅来接收计算监控改变的通知。
3. 确定监控类型
要检测一个属性是监控、计算监控还是其他,可以使用如下方法:
- ko.isObservable — 如果是监控对象,监控数组和计算监控,返回
true。 - ko.isWritableObservable —如果是监控对象,监控数组和可写计算监控,返回
true(也可写作ko.isWriteableObservable)。 - ko.isComputed — 如果是计算监控,返回
true。 - ko.isPureComputed — 如果是纯计算监控,返回
true。
4. 使用计算监控上下文
在执行计算监控求值函数期间,你能访问ko.computedContext来获取当前计算监控属性的信息。它提供了如下方法:
isInitial() —如果计算监控是第一次调用求值函数,该函数返回
true,否则返回false。对于纯计算监控,该方法一直是undefined。getDependenciesCount() — 返回在当前求值过程中计算监控被检测到的依赖数量。
*注意:
ko.computedContext.getDependenciesCount()等同于调用计算监控本身调用getDependenciesCount()。该方法也存在的原因是让ko.computedContext提供一种方式在计算监控构建完成之前,即第一次求值之前可以统计依赖数量。
例子:
var myComputed = ko.computed(function() {
// ... Omitted: read some data that might be observable ...
// Now let's inspect ko.computedContext
var isFirstEvaluation = ko.computedContext.isInitial(),
dependencyCount = ko.computedContext.getDependenciesCount(),
console.log("Evaluating " + (isFirstEvaluation ? "for the first time" : "again"));
console.log("By now, this computed has " + dependencyCount + " dependencies");
// ... Omitted: return the result ...
});
这些函数通常只会在某些复杂场景特别有用,比如当计算监控的主要目的是触发它的求值函数的一些副作用,你只想在第一次运行的时候执行一些配置逻辑,或者仅仅在它至少有一个依赖的情况下执行(因此可能在之后会被重新调用)。大多数计算监控属性不需要关心之前它们是否执行过,或者它们有多少依赖。
Knockout v3.4.0 中文版教程-9-计算监控-API参考的更多相关文章
- Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
2.可写的计算监控 初学者可能想要跳过本节 - 可写的计算监控是相当高级的部分,在大多数情况下不是必需的. 通常,计算监控是一个通过其他监控值计算出的值,因此是只读的. 令人惊讶的是,可以使计算监控值 ...
- Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性
4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...
- Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控
3. 计算监控 1.使用计算监控 如果你有一个监控的属性firstName和另一个lastName,但你想显示全名怎么办? 这就是引入计算监控的原因-这是依赖于一个或多个其他的observables函 ...
- Knockout v3.4.0 中文版教程-7-计算监控-依赖跟踪如何工作
3.依赖跟踪如何工作 初学者不需要知道这一点,但更高级的开发人员将想知道为我们怎么实现KO自动跟踪依赖性和自动更新UI的正确部分... 它其实相当简单优雅,跟踪算法如下: 当你定义一个计算监控,KO立 ...
- Knockout v3.4.0 中文版教程-4-通过监控数组工作
2.通过监控数组工作 1. 监控数组 如果你想检测或者响应一个对象的改变,你用observables.如果你想检测和响应一个集合的改变,使用observableArray.这个在很多情况下都非常有用, ...
- 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 中文版教程-11-控制文本内容和外观-text绑定
2. text绑定 目的 text绑定把传入的参数通过关联的DOM元素来显示文本值. 通常这对像<span>或<em>标签等使用,但技术上你可以对任何元素使用该绑定. 例子 T ...
- Knockout v3.4.0 中文版教程-14-控制文本内容和外观-style绑定
5. style绑定 目的 style绑定用来给关联的DOM元素添加或移除一个或多个样式值.在如下情况很有用,比如,当某些值为负时,高亮显示,或者设置容器元素的宽度来匹配数值的改变. (注意:如果你不 ...
随机推荐
- xml和TreeView
1.TreeView代码代码: private void Form1_Load(object sender, EventArgs e) {<br> //代码为TreeView添加子项 tr ...
- 中国区 Azure 和全球版 Azure:功能对比
由世纪互联运营的 Microsoft Azure(文中简称为中国区 Azure)是在中国大陆独立运营的公有云平台,与全球其他地区由微软运营的 Azure (文中简称全球版 Azure)服务在物理上和逻 ...
- Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)
一.基本概念 强制下线功能功能应该算是比较常见的了,很多应用程序都具备这个功能,比如你的QQ号或者微信号在别处登录了,就会将你强制挤下线.只需要在界面上弹出一个对话框,让用户无法进行任何其他的操作,必 ...
- 洛谷 P2617 Dynamic Ranking
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- bunzip2命令
bunzip2——解压缩.bz2格式文件 命令所在路径:/usr/bin/bunzip2 示例1: # bunzip2 yum.log.bz2 解压当前目录下的yum.log.bz2为yum.log, ...
- Linux Device Driver 学习(1)
Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...
- 原生js格式化json的方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
这是因为我把 [/WEB-INF/dispatcher-servlet.xml]的位置换成了[config/springmvc/dispatcher-servlet.xml] 因此idea在原来的位置 ...
- shell脚本,计算1+2+3+....100等于多少?
第一种方法,通过for循环来计算[root@localhost wyb]# cat yibai.sh #!/bin/bash #从1+++...100的结果 i= ` do sum=$(($sum+i ...
- CS193p Lecture 9 - Animation, Autolayout
Animation(动画) Demo Dropit续 Autolayout(自动布局) 三种添加自动布局的方法: 使用蓝色辅助虚线,右键选择建议约束(Reset to Suggested Constr ...