Knockout 最棒的一个特点就是它的可扩展性。Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序。许多开发者除了 Knockout 核心库之外没有使用任何其他的脚本库 ( 甚至包括 jQuery ) 就创建了非常棒的站点。
Subscribables
在创建我们的库存管理程序的时候,很容易发现在 Knockout 中 Observable 是一个核心对象。在 Observable,ObservableArray 和 Computed Observables 的底层是 Subscribable,Subscribable 是包含三个方法和一个 Subscriptions 数组的对象,这三个方法是:
subscribe:这个方法添加一个订阅到主题对象上,当订阅的主题发出提醒的时候,订阅就会被调用,默认的提醒类型是 change。
notifySubscribers:这个方法调用所有的订阅,并且会传递一个参数到订阅的回调方法中。
extend:这个方法为主题对象添加一个扩展
下面的代码演示了前两个方法的使用,实现了发布和订阅。
var test = ko.observable(); // create a subscription for the "test-event" test.subscribe(function (val) { console.log(val); }, test, "test-event"); test.notifySubscribers("Hello World", "test-event");
Knockout 中订阅的一个很酷的特性是可以混合到任何的 Javascript 对象中,下面的代码演示了在普通代码中使用的方式。
// Dummy Subscribable function PubSub() { // inherit Subscribable ko.subscribable.call(this); } // create an instance of our Subscribable var pubsub = new PubSub(); // make a subscription var subscription = pubsub.subscribe(function (val) { console.log(val); }, pubsub, 'test-topic'); pubsub.notifySubscribers("hello world", "test-topic"); // console: "hello world" // clean up things subscription.dispose();
在调用可订阅对象的subscribe 方法之后,我们得到了一个 Subscription 对象,通常开发者可以忽略这个 subscribe 方法返回的订阅对象,但是需要注意的是通过这个订阅对象 Subscription ,我们可以释放订阅的回调方法和应用中对于回调的引用,直接调用 dispose 方法就可以确信你的程序不会造成内存的泄露。
现在,你已经理解了 Knockout 的一个核心处理机制,Subscribable,我们将学习 Knockout 如何扩展它的用法在其它的模式。
Observables
Knockout 的 Observable 对象是实现订阅机制的头等对象,也是 Knockout 库中最为简单,也最为强大的部分。下面的代码演示了实现 Observable 的基本思想。
// Very Simple Knockout Observable Implementation // ko.observable is actually a function factory ko.observable = function (initialValue) { // private variable to hold the Observable's value var _latestValue = initialValue; // the actual "Observable" function function observable() { // one or more args, so it's a Write if (arguments.length > 0) { // set the private variable _latestValue = arguments[0]; // tell any subscribers that things have changed observable["notifySubscribers"](_latestValue); return this; // Permits chained assignments } else { // no args, so it's a Read // just hand back the private variable's value return _latestValue; } } // inherit from Subscribable ko.subscribable.call(observable); // return the freshly created Observable function return observable; };
这是 Knockout 中 observable 的一个简单实现 ( 真正的实现代码中包含了大量的强壮性处理代码,验证,依赖检测等等 ),从这个实现中可以看到实际上 observable 是一个函数的工厂,当调用这个工厂方法的时候,它生成了一个新的函数。这里实现了一个简单的 set/get API。如果你在不提供参数的情况下调用返回的函数,就会返回 _initialValue ,如果调用的时候提供了一个参数,就会设置 _initialValue ,并且通知所有的订阅。
当你创建事件驱动的程序的时候,Observable 可以得到大量的应用。我们可以创建事件驱动的程序架构,仅仅依赖事件 ( 比如按钮的点击,或者输入元素的变化等等 )而不是过程化的方法。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, knockout
, 方法
, 订阅
, 一个
, subscribe
, observable
Knockout数组
knockout1.5的绿色版、knockout 的使用方法、knockout、knockout.js、knockout 2.0汉化版,以便于您获取更多的相关知识。