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 ...
});
这些函数通常只会在某些复杂场景特别有用,比如当计算监控的主要目的是触发它的求值函数的一些副作用,你只想在第一次运行的时候执行一些配置逻辑,或者仅仅在它至少有一个依赖的情况下执行(因此可能在之后会被重新调用)。大多数计算监控属性不需要关心之前它们是否执行过,或者它们有多少依赖。