willson.tien 发表于 2013-1-27 04:58:29

extjs扩展之DynamicTableFormLayout

使用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.childNodes;        if(!row){            row = this.createRow();            this.table.tBodies.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.childNodes);    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;   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;


以上代码能满足动态添加行的需要,当然,这只是抛砖引玉,大家还可以添加动态删除行的功能等等
页: [1]
查看完整版本: extjs扩展之DynamicTableFormLayout