六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 58|回复: 0

extjs扩展之DynamicTableFormLayout

[复制链接]

升级  20%

2

主题

2

主题

2

主题

童生

Rank: 1

积分
10
 楼主| 发表于 2013-1-27 04:58:29 | 显示全部楼层 |阅读模式
使用ext的布局,当表单字段很多,有时候需要用到table的布局,仅仅table的布局还不能满足要求,比如说要显示fieldLabel,这时要使用form布局,当然,可以采用table中嵌套的方式来使用form布局,不过这样使用起来代码多,比较不方便,于是到处逛逛,在extjs的论坛中,找到了国外一哥们写的扩展TableFormLayout,使两种布局结合起来用,table中直接放textfield,这样也能满足一般的要求了,但是,有一种需求,比如说,我要动态添加行,这个时候该怎么办呢?
于是来修改TableFormLayout的代码,新增一些方法:


Ext.override(Ext.layout.FormLayout, {    fieldTpl: (function() {        var t = new Ext.Template(            '',                '{1}{4}',                '',                '',            ''        );        t.disableFormats = true;        return t.compile();    })()});/** * Table form layout **/Ext.layout.TableFormLayout = Ext.extend(Ext.layout.TableLayout, {    setContainer : function(ct){        Ext.layout.TableFormLayout.superclass.setContainer.call(this, ct);        if(ct.labelAlign){            ct.addClass('x-form-label-'+ct.labelAlign);        }        if(ct.hideLabels){            this.labelStyle = "display:none";            this.elementStyle = "padding-left:0;";            this.labelAdjust = 0;        }else{            this.labelSeparator = ct.labelSeparator || this.labelSeparator;            ct.labelWidth = ct.labelWidth || 100;            if(typeof ct.labelWidth == 'number'){                var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);                this.labelAdjust = ct.labelWidth+pad;                this.labelStyle = "width:"+ct.labelWidth+"px;";                this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';            }            if(ct.labelAlign == 'top'){                this.labelStyle = "width:auto;";                this.labelAdjust = 0;                this.elementStyle = "padding-left:0;";            }        }    },    fieldTpl: Ext.layout.FormLayout.prototype.fieldTpl,    renderItem : function(c, position, target) {        if (c && !c.rendered) {            Ext.layout.FormLayout.prototype.renderItem.call(this, c, 0, Ext.get(this.getNextCell(c)));        }    },       getRow : function(index){        var row = this.table.tBodies[0].childNodes[index];        if(!row){            row = this.createRow();            this.table.tBodies[0].appendChild(row);        }        return row;    },        createCell:function(colspan,rowspan,cellCls){     var cls = 'x-table-layout-cell';     var td = document.createElement('td');     if(colspan){   td.colSpan = colspan;  }  if(rowspan){   td.rowSpan = colspan;  }  if(cellCls){   cls += ' ' + c.cellCls;  }  td.className = cls;  return td;    },        createRow:function(){     var row=document.createElement('tr');        row.className="x-table-row";        return row;    },       insertRow:function(index,items){    var oldTr = Ext.get(this.table.tBodies[0].childNodes[index]);    var newTr = Ext.get(this.createRow());    newTr.insertAfter(oldTr);    if(items&&items.length&&items.length>0){    for(var i=0,j=items.length;i<j;i++){    var t=items[i];     var td = this.createCell(t.colspan,t.rowspan,t.cellCls);    newTr.appendChild(td);        Ext.layout.FormLayout.prototype.renderItem.call(this, t, 0, Ext.get(td));    }    }       }});Ext.Container.LAYOUTS['tableform'] = Ext.layout.TableFormLayout;


以上代码能满足动态添加行的需要,当然,这只是抛砖引玉,大家还可以添加动态删除行的功能等等
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表