网络编程
位置:首页>> 网络编程>> JavaScript>> YUI学习笔记(4)(2)

YUI学习笔记(4)(2)

作者:xujiwei 来源:HotHeart's BLOG 发布时间:2009-03-10 18:25:00 

标签:YUI,笔记,yahoo,JavaScript

subscribe 的签名为 subscribe: function(fn, obj, override),三个参数分别对应了 Subscriber 类构造函数的三个参数,分别对应了回调函数、额外对象参数以及是否使用额外对象参数作为执行上下文。subscribe 只是简单的判断参数 fn 是否有定义,然后会触发自定义事件订阅事件,最后使用这三个参数创建一个 Subscriber 对象添加到 CustomEvent 对象的 subscribers 属性中。

unsubscribe 方法用来取消事件的订阅,它的函数签名为 unsubscribe: function(fn, obj),两个参数分别是回调函数和额外对象参数,如果使用无参数调用 unsubscribe 方法,那么会直接调用 unsubscribeAll 来删除所有订阅者,否则会逐一判断 subscribers 中的每个对象,通过使用 Subscriber 对象的 contains 方法来判断给定的 fn 和 obj 与其是否一致,如果一致,就使用一个私有方法 _delete 来删除这个 Subscriber。

unsubscribeAll 方法没有参数,它只是简单的直接删除自定义事件的所有订阅者,最后直接给 subscribers 赋值一个空数组来避免有可能出现漏删订阅者的情况。

内部方法 _delete 的参数是 Subscriber 对象在 subscribers 数组中的索引,它会先删除 Subscriber 对象的 fn 和 obj 属性,最后使用 splice 方法将 Subscriber 对象从数组中删除。

var s = this.subscribers[index];
if (s) {
    delete s.fn;
    delete s.obj;
}
this.subscribers.splice(index, 1);

使用 delete 删除 Subscriber 对象的 fn 和 obj 属性是为了去除 回调函数及额外对象参数的引用,以免引起不必要的内存泄露。

CustomEvent 对象最重要的方法就是 fire 了,就是通过这个方法来通知所有了订阅者这个自定义事件被触发了。fire 方法先使用 Array 的 slice 方法将调用 fire 方法时的参数转化成数组,这样就可以在调用 Subscriber 的回调函数时可以传递参数给它们。

在遍历 subscribers 中的 Subscriber 前,fire 方法先使用了 subscribers 的 slice 方法来创建一个 subscribers 的副本,这样避免在执行 fire 的过程中有 Subscirber 取消订阅了这个自定义事件会导致错误。

在执行 Subscriber 的回调函数前,先使用 Subscriber 对象的 getScope 方法来获取执行回调函数时的上下文对象,再根据 CustomEvent 对象的 signature 属性来决定怎么去调用 Subscriber 的回调函数。

如果 signature 为 YAHOO.util.CustomEvent.FLAT,那么就把调用 fire 方法时的第一个参数做为回调函数的第一个参数,再把 Subscriber 对象的 obj 属性做为第二个参数:

s.fn.call(scope, param, s.obj)

如果 signature 为 YAHOO.util.CustomEvent.LIST,那么就除了把整个 fire 方法的参数列表传递给回调函数外,还要传递当前 CustomEvent 的名称给回调函数:

s.fn.call(scope, this.type, args, s.obj)

Subscriber 的回调函数如果在执行过程中出现了错误,那么 CustomEvent 的 lastError 属性就是指向错误对象的引用,另外,如果 YAOO.util.Event.throwErrors 为 true,那么会把这个错误再次抛出。

另外,Subscriber 对象也可以控制事件通知是否继续,如果 Subscriber 对象的回调函数执行后的返回一个 false,那么在 fire 方法中就会停止通知剩下的 Subscriber 对象,通常情况下,先订阅自定义事件的 Subscriber 可以阻止后订阅的 Subscriber 接收到通知。

使用 YUI 的自定义事件(CustomEvent)可以很方便地实现观察者模式,更好地组织 JavaScript 程序的结构。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com