YUI学习笔记(4)(2)
作者:xujiwei 来源:HotHeart's BLOG 发布时间:2009-03-10 18:25:00
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 程序的结构。


猜你喜欢
- defaultdict是普通字典dict的一个子类。通过collections库的defaultdict()方法创建。defaultdict
- 计算交并比:交的面积除以并的面积。要求矩形框的长和宽应该平行于图片框。不然不能用这样的公式计算。原理,从一维上来理解:两条红线的距离之和减去
- 1. 使用函数 np.random.random由于 np.random.random() 默认生成 0~1 之间的小数,因此需要转换一下如
- 本文实例讲述了Python实现将16进制字符串转化为ascii字符的方法。分享给大家供大家参考,具体如下:字符串456e633064316e
- 本文介绍如果使用python汇总常用的图表,与Excel的点选操作相比,用python绘制图表显得比较比较繁琐,尤其提现在对原始数据的处理上
- 总的来讲,JavaSever PagesTM(JSP)和 微软的Active Sever Pages(ASP)在技术方面有许多相似之处。两者
- 安装1、先安装vscode,然后在扩展中搜索Remote SSH插件并安装。2、我要连接远程Ubuntu系统的服务器,所以需要在服务器上安装
- 手写Vue服务端渲染概念:放在浏览器进行就是浏览器渲染,放在服务器进行就是服务器渲染。客户端渲染不利于 SEO 搜索引擎优化服务端渲染是可以
- 1、epochKeras官方文档中给出的解释是:“简单说,epochs指的就是训练过程接中数据将被“轮”多少次”(1)释义:训练过程中当一个
- 本文主要介绍了MySQL 8.0 驱动与阿里druid版本兼容问题解决,具体如下:注意:这个异常表面druid数据源的版本与MySql 8.
- Python 作为当前最热门的编程语言之一,不仅仅是因为它的学习成本低、入门容易,还因为它具有丰富的生态环境,包括内置的模块以及第三方的库,
- 基本的字符串位置查找方法Python 查找字符串使用 变量.find("要查找的内容"[,开始位置,结束位置]),开始位
- 1. 打开Anaconda Prompt(在命令行格式下,输入代码,建立pytorch环境、安装pytorch、测试pytorch过程)2.
- 1、余弦相似度余弦相似度衡量的是2个向量间的夹角大小,通过夹角的余弦值表示结果,因此2个向量的余弦相似度为:余弦相似度的取值为[-1,1],
- (GlobalImport全局导入功能)默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文
- 记得很早以前看到过这样的一段介绍:想象你在逛街边的一家书店,如果最终你没有购买任何图书就直接离开了,店长并不会知道你来过。但是如果你买了书,
- 前言转眼间已经参与过我厂好几个小程序的开发了,下面本妹子将开发中的那些注意点和各位小伙伴们分享下,妥妥的干货一枚。一、WXML不要换行写,有
- import time,datetime import urllib2 def
- 1、golang中获取请求接口中数据(GET)方式一: API参数 ctx.Param(name string)或者ctx.Params.B
- 本文实例为大家分享了小程序自定义弹出框效果的具体代码,供大家参考,具体内容如下my-pop----api:title ------字符串--