Computed Observables Reference 计算监控属性参考
下述文档描述了怎样构造和使用计算监控属性。
Constructing a computed ovservable 构造计算监控属性
一个计算监控属性可以使用下列任一方式进行构造:
1. ko.computed ( evaluator [, targetObject, options] ) -- 这种方式是创建计算监控属性最常用的方式,支持大多数场景。
evaluator -- 一个函数用来评估计算当前计算监控属性的值;
targetObject -- 如果设置该选项,该选项定义了 this 的值用在KO调用你的回调函数中;参见章节 managing this 以获取更多信息;
options -- 一个对象,拥有更多的属性用于计算监控属性,参加下述的完整列表;
2. ko.computed ( options ) -- 这种创建计算监控属性的方式拥有一个参数,可以传入带有以下属性的 javascript 对象。
read -- 必需的, 一个函数用来评估计算计算监控属性当前的值;
write -- 可选的, 如果设置该选项,意味着定义了一个可写计算监控属性。这是一个函数,接受其他代码传入计算监控属性的值,完全可以由你决定,通过自定义的逻辑处理传入的值,通过用于将这些值写入前置监控属性;
owner -- 可选的, 如果设置该选项,该选项定义了 this 的值用在KO调用你的 read 或 write 回调函数中;
pure -- 可选的, 如果该选项设置为true,当前计算监控属性将被设置为纯计算监控属性,这个选项可以用来替代ko.pureComputed构造器;
deferEvaluation -- 可选的, 如果该选项设置为true,那么计算监控属性的值只有在被实际视图访问或手动订阅时才会评估计算。默认情况下,计算监控属性会在创建时立即获得一个值;
diposeWhen -- 可选的,如果设置该选项,该函数将在每次进行计算监控属性垃圾回收的评估时被调用,函数的返回值如果为true则会触发销毁该计算监控属性;
diposeWhenNodeIsRemoved -- 可选的, 如果设置该选项,那么当指定的DOM元素被KO移除时会触发该计算监控属性的垃圾回收。这一特性用于在节点被模板和控制流绑定移除时销毁对应的计算监控属性;
3. ko.pureComputed ( evaluator [, targetObject] ) -- 构造纯计算监控属性,使用指定的计算函数和一个定义 this 的可选项; 不同于 kocomputed, 该该方法不支持选项参数;
4. ko.pureComputed ( options ) -- 使用选项对象定义纯计算监控属性,可接受的选项由 read, write 和 owner, 选项的定义同上;
Using a computed observable 使用计算监控属性
计算监控属性提供一下的函数:
dispose() -- 手动销毁计算监控属性,清除其所有的依赖订阅,这个函数在一些场合很有用,例如你想要停止被计算监控属性更新,或者需要清理仍被依赖关联的计算监控属性内存;
extend( extenders ) -- 计算监控属性接受指定的 extenders 扩展;
getDependenciesCount() -- 获取当前计算监控属性的依赖数量;
getSubscriptionsCount( [event] ) -- 获取当前计算监控属性的订阅(不论来自其它计算监控属性还是手动订阅)。可以任意传入一个事件名(例如“change”)用来获取该事件的订阅数量;
isActive() -- 返回当前计算监控属性是否是激活状态,即是否可以被更新,当计算监控属性不包含任何订阅时会处于inactive闲置状态;
peek() -- 在不创建依赖的情况的返回计算监控属性的当前值(参见章节 peek )
subscribe( callback [, callbackTarget, event] ) -- 返回一个手动订阅用来通知计算监控属性的变化;
Determining the observable type 检测监控属性的类型
检测一个属性是监控属性,计算监控属性等等,可以使用如下的方法:
ko.isObservable -- 当为监控属性,监控数组,所有计算监控属性时返回 true;
ko.isWritableObservable -- 当为监控属性,监控数组,可写计算监控属性时返回 true(等效函数为 ko.isWriteableObservable);
ko.isComputed -- 所有计算监控属性都返回 true;
ko.isPureComputed -- 当为纯计算监控属性时返回 true;
Using the computed context 使用计算上下文
在执行计算监控属性的评估计算函数时你可以访问 ko.computedContext 用来获取当前计算属性的信息。它提供了如下方法:
isInitial() 当该函数在计算监控属性的计算函数首次执行时被调用则返回true, 否则返回 false, 对于纯计算监控属性 isInitial() 总是 undefined;
getDependenciesCount() -- 返回截止到执行当前评估计算函数时检测到的依赖数量;
注意: ko.computedConext.getDependenciesCount() 等价于调用计算监控属性本身的getDependenciesCount(); 它提供了一个在计算监控属性完成构造之前,在首次执行评估计算函数时获取依赖数量的方式,例如:
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... });
这些工具函数通常只在高级场景下有用,例如,当你的计算监控属性主要目的是为了在评估计算时触发一些附带效果,或者你只想在首次执行评估计算时执行一些设置逻辑,或者当且仅当其只有一个依赖时,大多数场景下,计算属性并不需要关心评估计算函数是否被执行过,或者它们有多少依赖。