NHibernate+spring.net+jquery打造UI控件库系列(两部分)------UI库的核心,命名空间与模块化管理(不知这样说对不对?)

    很多朋友问我这个系列为什么没有进展?

    其实我想说,这个系列迟迟没有动手是有原因的:最近忙于自定义表单的开发,并且只有一个人在做,单是单元格的拖拉选择合并与拆分,类似EXCEL的功能,已经搞得我头都大啦,可能是水平的问题,不知园里的朋友可否指点一下,很真心地请教。再加上项目本身很紧,所以根本没有时间去写这个系列,今天是星期天,悄悄地写了这些,希望对大家有点帮助。我知道时间是挤出来的,我会努力....只希望大家谅解。

      本身之前的所有的控件库都是JQUERY语法的,那天晚上和xuld聊了一下,同时也认真看了他发给我他的类库(这里谢谢啦),感觉还是用对象的方法调用比较好一点,起码有些人不一定喜欢JQuery.但以后的Dom操作还是基于JQ,今天再一次认真地看了EXT源码,参照了其的实现形式和其中的继承(extend)方法写了我们的UI库第一个版本.有兴趣的朋友可以看看

     这里直接上代码啦

 Sw = {
    version: '1.0',
    apply: function(destination, source, defaults) {
        if (defaults) {Sw.apply(destination, defaults);}
        if (destination && source && typeof source == 'object') {
            for (var p in source) {
                destination[p] = source[p];
            }
        }
        return destination;
    }
};
Sw.apply(Sw, {
    applyIf: function(destination, source) {
           for (var b in source)
             if (destination[b] === undefined)
                 destination[b] = source[b];
             return destination;
    },
    extend: function() {
        var io = function(o) {
            for (var m in o) {
                this[m] = o[m];
            }
        };
        var oc = Object.prototype.constructor;
        return function(sb, sp, overrides) {
            if (typeof sp == 'object') {
                overrides = sp;
                sp = sb;
               sb = overrides.constructor != oc ? overrides.constructor : function { sp.apply (this,arguments); };
            }
            var F = function() { },
                    sbp,
                    spp = sp.prototype;
            F.prototype = spp;
            sbp = sb.prototype = new F();
            sbp.constructor = sb;
            sb.superclass = spp;
            if (spp.constructor == oc) {
                spp.constructor = sp;
            }
            sb.override = function(o) {
                Sw.override(sb, o);
            };
            sbp.superclass = sbp.supr = (function() {
                return spp;
            });
            sbp.override = io;
            Sw.override(sb, overrides);
            sb.extend = function(o) { return Sw.extend(sb, o); };
            return sb;
        };
    } (),
    override: function(origclass, overrides) {
        if (overrides) {
            var p = origclass.prototype;
            Sw.apply(p, overrides);
            if ($.browser.msie && overrides.hasOwnProperty('toString')) {
                p.toString = overrides.toString;
            }
        }
    },
    Namespace: function() {
        var o, d;
        $(arguments).each(function(index, v) {
            d = v.toString().split(".");
            o = window[d[0]] = window[d[0]] || {};
            $(d.slice(1)).each(function(index, v2) {
                o = o[v2] = o[v2] || {};
            });
        });
        return o;
    }
});
Sw.applyIf(String, {
        format: function(format) {
            if (arguments.length == 0) return "";
            if (arguments.length == 1) return arguments[0];
            var args = arguments;
            return arguments[0].replace(/{(\d+)?}/g, function(m, i) {
                return args[parseInt(i) + 1];
            })
        }
    });
下面我简单地示例下这个库的运用,至于其他,大家可以下载代码回去看看

       

    <script type="text/javascript">
         /**
         * @使用命名空间
         * @Namespace example
         */
             Sw.Namespace("Darren.Controls.DatePicker")
             Darren.Controls.render = function() { alert("controlsWidth:200px"); }
             Darren.Controls.DatePicker.render = function() { alert("DatePickerWidth:200px"); }
         /**
         * @构造函数
         * @Construct example
         * @params:object------>注意such as {width:"200"}or {width:"200",height:"100"}
         */
         //添加构造函数
             Darren.Controls.DatePicker = function(objParams) {
               
                 Sw.apply(this, objParams);
             }
         //添加实例方法-----------------参照(1)
             Sw.apply(Darren.Controls.DatePicker.prototype, {
                 print: function() {
                     alert(String.format("width:{0},height:{1}", this.width, this.height));
                 }
             })
         /**
         * @类属性,类实例方法,类静态方法
         * @property method example
         */
         //添加一个颜色属性和一个静态方法show()
             Sw.apply(Darren.Controls.DatePicker.prototype, {
                 color:"#FF0000",
                 show: function() { alert(String.format("this.datePicker.color:{0},但我是调用一个实例方法呵",this.color)); }
             })
         //添加类静态方法
             Darren.Controls.DatePicker.show = function() {
               alert(String.format("this.datePicker.color:{0},我是调用一个静态方法哈", this.color));
           }
         /**
          * @方法重写
          * @override method example
          */
           Sw.apply(Darren.Controls.DatePicker.prototype, {
               dispose: function() { alert(String.format("this.datePicker.color:{0}", this.color)); }
           })
           //重写dispose方法-*** //方法二可参考类继承部分
           Sw.apply(Darren.Controls.DatePicker.prototype, {
               dispose: function() { alert(String.format("this.datePicker.color:{0},但我已经重写了此方法", this.color)); }
           })
          /**
           * @类继承,以及别名的应用
           * @class extend example
           */
 
            DC = Darren.Controls; //命名空间的别名
            //*******************父类*********************
            //构造方法
            DC.Panel = function(param){
                Sw.apply(this,param);
            }
            DCP =DC.Panel; //类别名
            //演示类实例方法
            Sw.apply(DCP.prototype, {
                name: "my name is panel",
                color: "my color is #FFFFFF", 
                initialize:function(){
                alert(String.format("{0},{1}", this.name, this.color));
                }
            })
            //*******************子类1*********************
            DC.Window = function(param) {
              Sw.apply(this,param);
            }
            DCW = DC.Window;
            //让window 继承panel并重写initialize()方法
            Sw.extend(DCW, DCP, {
            name: "my name is window",
                //大家可以试着注释下面方法重写,就是调用父类的initialize()方法
                initialize: function() {     
                    alert(String.format("{0},{1}我的颜色是我父亲的,但是我的名字改了哦,呵呵", this.name, this.color));
                }
            })
            $(function() {
                //************** 演示(大家可以去掉注释个个测试)***********************
                //**命名空间,别名
                //new Darren.Controls.render();
                //new Darren.Controls.DatePicker.render();
                //**构造函数
                //var datepicker = new Darren.Controls.DatePicker({ width: "200", height: "100" });
                //      datepicker.print();
                //**类属性,类实例方法,类静态方法
                //var datepicker = new Darren.Controls.DatePicker();
                //调用实例方法
                //datepicker.show();
                //调用静态方法
                //Darren.Controls.DatePicker.show();
                //**方法重写
                // var datepicker = new Darren.Controls.DatePicker();
                //调用实例方法
                //datepicker.dispose();
                //**类继承,以及别名的应用
                // var dialog = new DCW();
                //dialog.initialize();        

            });   
     </script>

 为什么要写这个示例呢?很简单,以后的日子还长着呢...呵呵只是给个大家以后沟通的方式罢啦.之后的控件系列都会基于这样的语法来实现的.不知道大家有什么好的建议?示例代码

    

 

posted @ 2011-01-09 22:44  darrenyan  阅读(2940)  评论(8编辑  收藏  举报