`
yiminghe
  • 浏览: 1453079 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

YUI3沙盒下的多模块交互实践

阅读更多

看了 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
1
0
分享到:
评论
1 楼 houfeng0923 2011-07-21  
学习了,

相关推荐

    yui3-master.zip

    在“yui3-master.zip”中,我们可以看到不同模块的源代码文件,如“build”目录下的“node”, “event”, “dom”等,这些都是YUI3的核心模块。 2. **事件系统** YUI3的事件系统是其强大功能之一,它允许开发者...

    YUI3.7.3 最新版本 带API

    6. **动画模块**:YUI3的动画模块可以轻松创建复杂的动画效果,支持CSS属性、颜色、尺寸等多方面的动画过渡。 7. **Node模块**:Node模块提供了一个轻量级的DOM抽象层,使得与DOM交互更加方便。 8. **API文档**:...

    YUI3 中tree的两种实现

    YUI3 Gallery是YUI3的一个扩展库,包含了更多非核心但实用的组件。在“YUI3 中tree的两种实现”博文中,作者可能介绍了利用Gallery中的扩展来创建更复杂或具有特定功能的树。例如,可能使用了`treeview-dragdrop`...

    YUI3 dialog组件

    Dialog组件是YUI3中的一个重要部分,它允许开发者创建可交互的弹出窗口,常用于提示信息、确认操作、展示详细内容等场景。 ### 1. Dialog组件的基本结构 Dialog组件由几个关键部分组成: - **容器(Container)**...

    yui3-3.17.2最新版

    在实际使用YUI 3.17.2时,开发者可以通过`yui3-3.17.2`这个压缩包文件获取所有必要的资源。这个压缩包中包含了库的源码、示例、文档和其他辅助工具。开发者可以按照项目需求,选择合适的模块和组件进行集成。 在...

    yui.rar 例子

    在“yui.rar”里,可能包含有如“yui-core”、“yui-dom”、“yui-event”等基础模块,这些模块分别对应核心功能、DOM操作和事件处理。开发者可以通过精确定义配置,选择需要的模块,确保代码高效运行。 YUI还提供...

    YUI 入门教程YUI 入门教程YUI 入门教程

    除此之外,YUI还提供了动画模块、CSS样式管理、数据处理、表格、菜单、表单验证等多种组件,覆盖了Web开发的多个方面。其模块化设计使得开发者可以根据需要选择和加载必要的功能,避免了不必要的性能开销。 总之,...

    YAHOO YUI3简单入门

    YUI3是YUI的第三个主要版本,它在设计时注重模块化、可扩展性和性能优化,提供了一系列用于处理DOM操作、事件处理、动画效果、Ajax通信、数据存储等任务的工具。本教程将带你入门YUI3的基础知识。 **模块化设计** ...

    yui 资源包

    3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...

    YUI3.6文档及示例

    1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...

    YUI.rar_html_javascript YUI_yui_yui javascript

    4. **拖放功能**:YUI的Drag & Drop模块支持元素的拖放操作,适用于创建可交互的布局或组织工具。 5. **数据表格**:YUI的DataTable组件可用于展示和操作大量数据,支持排序、过滤和分页等功能。 通过学习和实践...

    从YUI2到YUI3看前端的演变 pdf

    YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...

    yui 3.1.2 源码 6MB大小 0资源分

    源码分析对于开发者来说,不仅能帮助理解YUI的工作原理,还可以学习到优秀的编程实践,比如模块化设计、事件驱动编程、性能优化等方面的知识。通过研究YUI 3.1.2的非压缩源码,我们可以深入理解这个强大库的内部构造...

    yui_3.8.1.zip

    8. **国际化与本地化**:YUI的Lang模块支持多语言环境,方便实现应用的国际化和本地化。 三、YUI 3.8.1的组件库 在YUI 3.8.1中,除了上述核心特性外,还包括众多实用的组件: 1. **DataTable**:用于创建交互式...

    YUI3 Cookbook

    - **知识点**:YUI3 Gallery是一个社区驱动的扩展集合,包含了更多的插件和组件,通过加载这些模块可以扩展YUI3的功能。 - **应用场景**:适用于需要更高级功能或特定插件的情况。 6. **加载YUI2部件** - **知识...

    yahoo3.0 YUI Examples

    2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果、I/O处理等,这些都是构建交互式Web应用的基础。 3. **CSS组件**:YUI提供了丰富的CSS样式库,如Grids(网格布局)、Buttons(按钮)、Forms...

    Yahoo YUI 插件库

    3. **拖放功能**:YUI的DragDrop模块提供了强大的拖放功能,使得用户可以轻松地在页面上移动元素,这对于构建交互式应用非常关键。 4. **日期和时间选择器**:YUI Calendar组件提供了一个用户友好的日历界面,可以...

Global site tag (gtag.js) - Google Analytics