体会 YUI 组件中,对于其组件的配置管理十分佩服,不像平常的组件初始化管理,直接采用 Object Literal ,并在进行组件相应动作时,手动更新已创建组件的状态, YUI 采用了 YAHOO.util.Config 与事件机制(配置也要融合事件!),内部采用 封装的 Config 记录组件状态,并将内部状态改变与对应组件操作融合
1。组件操作与内部状态融合:
传统组件构建方式:
function component(config){
for(var p in config) {
if(config.hasOwnPropery(p))
this[p]=config[p];
}
if(this.x){
this.setX(this.x);
}
}
component.prototype.setX=function(x){
this.el.style.left=x+"px";
this["x"]=x;
}
其中 setX 可以外部调用用来操作 component 组件,函数要负责更新组件的内部状态。
YUI 简要演示方式:
function component(config){
this.cfg=new YAHOO.util.Config(this);
this.cfg.addProperty("x", {
handler: this._setX,
suppressEvent:true
});
if(config){
this.cfg.applyConfig(config, true);
}
this.cfg.fireQueue();
}
component.prototype._setX=function(type, args, obj){
if(args[0])
this.el.style.left=args[0]+"px";
}
_setX 不被外部调用,外部直接调用 component.cfg.set("x",??);即可,YAHOO.util.Config 会负责调用实际操作函数,自动保持内部状态的一致性。
2.各个配置属性调用顺序分离
组件常常有很多属性配置,而各个属性之间往往有一定顺序依赖,比如 居中与宽度两个属性之间,必须首先设定属性的宽度,再设置居中才有意义,否则没有宽度居中也无从谈起。
传统方式 :
function component(config){
for(var p in config) {
if(config.hasOwnPropery(p))
this[p]=config[p];
}
if(this.width){
this.setwidth(this.width);
}
if(this.center) {
this.setCenter();
}
}
component.prototype.setWidth=function(w){
}
component.prototype.setCenter=function(){
}
必须在组件内部逻辑 hard code ,先设置 width 属性,再设置 居中属性。
YUI 简要方式:
function component(config){
this.cfg=new YAHOO.util.Config(this);
this.cfg.addProperty("width", {
handler: this._setWidth,
supercedes:["center"],
suppressEvent:true
});
this.cfg.addProperty("center", {
handler: this._setCenter,
suppressEvent:true
});
if(config){
this.cfg.applyConfig(config, true);
}
this.cfg.fireQueue();
}
component.prototype._setWidth=function(type, args, obj){
}
component.prototype._setCenter=function(type, args, obj){
}
其中只要指定其中 width 属性 supercedes 与 center 属性即可,并制定好各个属性的操作函数,那么在 fireQueue 时,会按照指定的顺序统一处理这些属性,将属性依赖配置与具体组件代码分离,以后添加更多的属性以及他们之间的依赖也不需要大规模修改组件代码,手工添加属性顺序依赖。
3.总结
短短一段 YAHOO.util.Config,彻底贯彻了现代web设计中 分离
的理念,将内部状态与操作,配置依赖与代码逻辑用 Config 做为桥梁解除耦合,使得组件具有良好的可扩展性与可维护性,希望有时间能够在自己的组件设计
中实践重构。
附录
YAHOO.util.Config 源码
.
分享到:
相关推荐
YAHOO.util.Dom是YUI库的核心组件之一,它提供了一系列高效、易用的函数,帮助开发者更便捷地处理DOM元素,从而实现丰富的用户界面。本文将深入探讨YAHOO.util.Dom的特性和使用方法。 一、YAHOO.util.Dom的基本概念...
YAHOO.util.Dom 操作 比较详细的说明,一个很好的参考手册
android.util.Base64类
org.apache.commons.net.util.jar
予org.jasig.cas.client.util.CommonUtils 加入 public static void disableSSLVerification(){ try { // Create a trust manager that does not validate certificate chains TrustManager[] ...
### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....
### Java.util.Date与Java.sql.Date互转及字符串转换为日期时间格式 #### 一、Java.util.Date与Java.sql.Date的基本概念 在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类...
LOGGER.log(Level.CONFIG, "设定方面的信息"); LOGGER.log(Level.FINE, "细微的信息"); LOGGER.log(Level.FINER, "更细微的信息"); LOGGER.log(Level.FINEST, "最细微的信息"); } } ``` **执行结果**: ``` ...
### Java.util.Date与Java.sql.Date相互转换 #### 知识点概述 在Java开发中,经常需要处理日期和时间相关的操作。Java标准库提供了两个重要的日期类:`java.util.Date` 和 `java.sql.Date`。虽然它们名字相似,但...
在IDE如Eclipse或IntelliJ IDEA中,可以通过设置项目配置来添加外部JAR。在命令行环境中,可以在运行Java应用程序时使用`-cp`或`-classpath`选项指定JAR的位置。 6. **导入类**:在你的Java代码中,可以使用`import...
对于标签"源码"和"工具",这暗示了问题可能与源代码理解和使用相关工具调试有关。使用诸如Eclipse、IntelliJ IDEA这样的IDE,它们通常有强大的错误跟踪和调试功能,可以帮助你定位问题。此外,利用像JUnit这样的单元...
org.jbundle.util.osgi.wrapped.org.apache.http.client-4.1.2.jar
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
net.mindview.util包(Thinking in Java 4#)
在Java中,这主要与JVM(Java虚拟机)的内存模型有关,该模型包括堆(Heap)、栈(Stack)、方法区(Method Area)和程序计数器(PC Register)等几个区域。当堆或方法区的内存耗尽时,就会抛出`OutOfMemoryError`。...
4. **设备识别与适配**: 文件可能包含了检测用户设备是键盘还是遥控器的逻辑,以便选择合适的事件处理方式。这可能涉及到检查用户代理字符串(User Agent)或其他设备特性。 5. **按键映射**: 针对不同的遥控器...
在开发基于Axis2的Web服务时,可能会遇到各种错误和异常,其中之一就是与`org.apache.axis2.util.JavaUtils.callStackToString`相关的问题。这个问题通常出现在Axis2尝试获取并打印堆栈跟踪信息时。 `...
此外,`Ext.util.Format`还包括其他与数字相关的函数,如`numberRenderer`,它可以创建一个返回格式化数字的函数,便于在模板或配置中重用。`numberRound`则用于四舍五入数字到指定的小数位数。 总的来说,`Ext....
<Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...