看了 NCZ 的 scalable-javascript-application-architecture
后对YUI3的沙盒设计以及模块管理有了更深的理解,尤其其中的模块交互方式非常有趣。
传统模式:
以前使用ext,jquery的多模块交互模式:
页面两个模块 m ,m2 ,当 m 变化时需要通知 m2 更新自己的相关状态。
var m=new Module1();
var m2=new Module2();
m.on("change",function(e){
m2.update(...);
});
m.fire("change","hello");
耦合问题:
由以上代码可见,m ,m2实际上已经耦合在一起,它们必须出现在页面的相同位置,并且如果需求变化去除了m2,则m1.on也必须去除。
YUI3事件解耦方式:
YUI3事件引入了bubble以及broadcast模式,尤其broadcast,可以将事件传递到全局事件空间,其他模块只要监听全局事件即可,去除了和某一模块的耦合性。
修正版:
YUI({
filter:"DEBUG"
}).use("base","event","node","event-simulate","event-custom","node-event-simulate","plugin","oop","pluginhost",function(Y){
function Module1(){
Module1.superclass.constructor.call(this);
this.publish("change",{
emitFacade:true,
//该事件需要bubble到全局空间
broadcast:2
});
}
Module1.NAME="Module1";
Y.extend(Module1,Y.Base);
var change=Y.one("#trigger");
var m=new Module1();
change.on("click",function(){
m.fire("change","hello");
});
});
YUI({
filter:"DEBUG"
}).use("base","event","node","event-simulate","event-custom","node-event-simulate","plugin","oop","pluginhost",function(Y){
function Module2(){
Module2.superclass.constructor.call(this);
}
Y.extend(Module2,Y.Base,{
update:function(args){
alert("Module2 knowns Module1's change :"+args);
}
});
var m=new Module2();
//另一模块只需监听某模块发布到全局空间的change事件,并更新自己状态
Y.Global.on("Module1:change",function(e){
m.update(e.details);
});
});
则可见 模块1,模块2边界非常清晰,可以根据需求变化随意去除任一模块,系统更具灵活性。
PS:事件的前缀机制
首先可以看事件机制的详细解释
,在上述例子中,我们看到了 Global监听的事件为Module1:change,而不是普通的change,而这个Module1正是module1类的名字配置,EventTarget中有prefix的机制,但是平常直接augment,EventTarget时这个机制是没有对应开启功能,当从Base继承时,Base初始化自己的事件机制的prefix为配置的类名:
//init:
this._yuievt.config.prefix = this._eventPrefix=this.constructor.EVENT_PREFIX || this.constructor.NAME;;
那么在 EventTarget功能代码中,每次进行on以及fire都会检查是否存在prefix,如果绑定的参数为eventName形式,会被补全为prefix:eventName的形式,prefix默认为自己的prefix
var parts = _parseType(type, this._yuievt.config.prefix)
//加入前缀标识
type=parts[1];
可见如果单单监听change事件,则实际效果为监听自身的change,而如果要监听某类对象的change,这正是prefix发挥余地的地方,也避免了多类对象同名事件的混淆。
参考资料:
2010-10-21 新瓶老酒:managing javascript object

- 大小: 118.1 KB
分享到:
相关推荐
在“yui3-master.zip”中,我们可以看到不同模块的源代码文件,如“build”目录下的“node”, “event”, “dom”等,这些都是YUI3的核心模块。 2. **事件系统** YUI3的事件系统是其强大功能之一,它允许开发者...
6. **动画模块**:YUI3的动画模块可以轻松创建复杂的动画效果,支持CSS属性、颜色、尺寸等多方面的动画过渡。 7. **Node模块**:Node模块提供了一个轻量级的DOM抽象层,使得与DOM交互更加方便。 8. **API文档**:...
YUI3 Gallery是YUI3的一个扩展库,包含了更多非核心但实用的组件。在“YUI3 中tree的两种实现”博文中,作者可能介绍了利用Gallery中的扩展来创建更复杂或具有特定功能的树。例如,可能使用了`treeview-dragdrop`...
Dialog组件是YUI3中的一个重要部分,它允许开发者创建可交互的弹出窗口,常用于提示信息、确认操作、展示详细内容等场景。 ### 1. Dialog组件的基本结构 Dialog组件由几个关键部分组成: - **容器(Container)**...
在实际使用YUI 3.17.2时,开发者可以通过`yui3-3.17.2`这个压缩包文件获取所有必要的资源。这个压缩包中包含了库的源码、示例、文档和其他辅助工具。开发者可以按照项目需求,选择合适的模块和组件进行集成。 在...
在“yui.rar”里,可能包含有如“yui-core”、“yui-dom”、“yui-event”等基础模块,这些模块分别对应核心功能、DOM操作和事件处理。开发者可以通过精确定义配置,选择需要的模块,确保代码高效运行。 YUI还提供...
YUI3是YUI的第三个主要版本,它在设计时注重模块化、可扩展性和性能优化,提供了一系列用于处理DOM操作、事件处理、动画效果、Ajax通信、数据存储等任务的工具。本教程将带你入门YUI3的基础知识。 **模块化设计** ...
3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...
1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...
4. **拖放功能**:YUI的Drag & Drop模块支持元素的拖放操作,适用于创建可交互的布局或组织工具。 5. **数据表格**:YUI的DataTable组件可用于展示和操作大量数据,支持排序、过滤和分页等功能。 通过学习和实践...
Kissy是由淘宝网开发的一款高性能的轻量级JavaScript库,它借鉴了YUI3的模块化设计思想,为前端开发提供了强大的工具集。Kissy的核心模块化实践可以分为两大部分:核心模块和业务应用模块。 ##### 2.1 Kissy核心...
YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...
源码分析对于开发者来说,不仅能帮助理解YUI的工作原理,还可以学习到优秀的编程实践,比如模块化设计、事件驱动编程、性能优化等方面的知识。通过研究YUI 3.1.2的非压缩源码,我们可以深入理解这个强大库的内部构造...
8. **国际化与本地化**:YUI的Lang模块支持多语言环境,方便实现应用的国际化和本地化。 三、YUI 3.8.1的组件库 在YUI 3.8.1中,除了上述核心特性外,还包括众多实用的组件: 1. **DataTable**:用于创建交互式...
- **知识点**:YUI3 Gallery是一个社区驱动的扩展集合,包含了更多的插件和组件,通过加载这些模块可以扩展YUI3的功能。 - **应用场景**:适用于需要更高级功能或特定插件的情况。 6. **加载YUI2部件** - **知识...
2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果、I/O处理等,这些都是构建交互式Web应用的基础。 3. **CSS组件**:YUI提供了丰富的CSS样式库,如Grids(网格布局)、Buttons(按钮)、Forms...
总的来说,这个压缩包包含了使用YUI库实现AJAX功能所需的各种组件和资源,涵盖了前端开发中的多个重要方面,如用户交互、数据交换、动态效果等。开发者可以利用这些源码和组件来快速构建功能丰富的Web应用,同时享受...
3. **拖放功能**:YUI的DragDrop模块提供了强大的拖放功能,使得用户可以轻松地在页面上移动元素,这对于构建交互式应用非常关键。 4. **日期和时间选择器**:YUI Calendar组件提供了一个用户友好的日历界面,可以...