isObservable和isSubscribable之间的区别

Mar*_*sen 9 knockout.js

似乎他们返回相同的结果,为什么使用一个而不是另一个?

var computed = ko.computed(function(){return 'foo';});
var observable  = ko.observable();
var observableArray  = ko.observableArray();

console.log('computed isObservable', ko.isObservable(computed));
console.log('observable isObservable', ko.isObservable(observable));
console.log('observableArray isObservable', ko.isObservable(observableArray));

console.log('computed isSubscribable', ko.isSubscribable(computed));
console.log('observable isSubscribable', ko.isSubscribable(observable));
console.log('observableArray isSubscribable', ko.isSubscribable(observableArray));
Run Code Online (Sandbox Code Playgroud)

全部记录为真. http://jsfiddle.net/1fvjuj9v/1/

Ret*_*sam 8

因此,可订阅是一个淘汰对象,与可观察对象或计算对象不同,但是可观察对象和计算对象都继承自.可订阅的是可以订阅的任何内容; 任何可以发出代码的其他部分可以侦听的事件的东西.它是observable.subscribe(function() {})功能源自的地方.

另一方面,可观察的是可订阅的特定类型:它是一个可订阅的,它包含一个值,并在该值发生变化时向其订阅者发出新值.可观察的"具有当前值"部分不是"可订阅"的固有部分,只有"向其订户发送事件"部分是.

它用得不多,但你可以直接构造可订阅的,它们会通过ko.isSubscribable测试但是测试失败ko.isObservable,因此这两种方法之间存在差异.

虽然我个人还没有看到它在实践中完成,但是这篇博文ko.subscribable通过在subscribables之上构建Pub/Sub接口,给出了如何使用或扩展功能的示例.

关于自定义函数淘汰文档,此图表说明了这种关系. 图表显示之间的关系


但是请注意,上面的图表在某一点上有点欺骗性:ko.computed实际上ko.observable并非ko.subscribable直接来自.因此为什么ko.isObservable(computed)返回true.然而,通过该图表所示的关系用于继承加入到敲除对象的自定义功能的关系.(这是有道理的,因为这是它所找到的文档页面的主题)

因此,如果您定义了一个自定义函数ko.subscribable.fn,那么它将在计算机和可观察对象上都可用...但是如果您在ko.observable.fn它上面定义一个,那么只能在observables(和可观察数组)上使用,而不是在计算机上,尽管事实是ko.isObservable(computed)返回true.