ExtJS 的组建扩展方法

ExtJS 是一个不错的JS 类库,提供了很多组建。

 

但是有时候根据项目不同我们需要对他的组建进行一些修改,比如更方便使用之类的。

 

好在Ext提供了Ext.override方法可以对原有组建进行扩展或者重构。

 

以下是几个扩充的例子

 

 

 

 

修复 Ext.TabPanel的一个BUG
说明:Ext.TabPanel如果标签页没有激活的话,其中的内容就不会被初始化。
 (如果需要提交全部Tab页内容的时候会出现错误,解决办法是将全部标签页都激活一次。
  这个操作也可以封装成一个方法,在初始化TabPanel之后调用)

Ext.override(Ext.TabPanel, {
 //激活全部Tab
 ensureActiveTab : function() {
  this.el.mask();
  this.beginUpdate();
  var items = this.items;
  var activeTab = this.getActiveTab();
  for (var i = items.getCount(); i >= 0; i--) {
   this.setActiveTab(items.itemAt(i));
  }
  if (activeTab) {
   this.setActiveTab(activeTab);
  }
  this.endUpdate();
  this.el.unmask();
 }
});

 

使用

tabpanel=new Ext.TabPanel(...);
tabpanel.ensureActiveTab();  //该方法会将全部TAB页面都初始化一次,最后选中默认的TAB页标签

 

 

 

/**
 * 扩充 Ext.form.FormPanel
 */

我们需要对Ext表单操作的时候,往往需要先通过FormPanel得到BasicForm,然后在进行操作。
比如清空一个表单需要写成。
FormPanel.form.reset();

有时候这样比较繁琐,我们可以通过对FormPanel进行改造,让代码更简洁。
以下是将BasicForm的一些方法封装到FormPanel中,以便使用的时候更方便一些。

 

Ext.override(Ext.form.FormPanel, {
    reset : function() {
        return this.getForm().reset();
    },
    isValid : function() {
        return this.getForm().isValid();
    },
    setValues : function(values) {
        return this.getForm().setValues(values);
    },
    getValues : function(asString) {
        return this.getForm().getValues(asString);
    },
    findField : function(id) {
        return this.getForm().findField(id);
    },
    markInvalid : function(errors) {
        return this.getForm().markInvalid(errors);
    }
});

 

 

这样我们使用的时候不需要写

FormPanel.getForm().reset();

 

而只需要写

FormPanel.reset();

 

 

 

 /**
 * 扩充Ext.form.ComboBox
 */

 

Ext的ComboBox有需要写很多参数,而且初始化数据的数组结构写起来也不是很明了。

但是实际上我们可以根据实际应用,将这些参数封装。

Ext.override(Ext.form.ComboBox, {
  triggerAction : 'all',  //默认是query,但是我们一般都需要下拉框显示全部内容
  editable : false, //Ext默认可编辑,但其实我们多数情况下拉框都不可编辑
  mode : 'local', // 设置本地读取数据
  valueField : 'value',
  displayField : 'text',
  /* 重载initComponent 设置默认hiddenName为组件name */
  initComponent : (function() {
   var originalInitComponent = Ext.form.ComboBox.prototype.initComponent;
   return (function() {
    //如果不是通过转换DOM元素生成的控件,并且控件类型是combo,并且控件配置了name属性,并且控件未配置hiddenName属性,那么将hiddenName设置为name
    if (!this.transform && this.xtype == "combo" && ("name" in this) && !("hiddenName" in this)) {
     this.hiddenName = this.name;
    }
    //如果this.store是Object MAP{value:text}格式的话,将其适配成Array格式数据
    if (Ext.isObject(this.store)) {
     var value, text, store = [];
     for (value in this.store) {
      if (Ext.isString(text = this.store[value])) {
       store.push([value, text]);
      } else {
       store = false;
       break;
      }
     }
     if (store) {
      this.store = store;
     }
     value = text = store = null;
    }
    originalInitComponent.apply(this, arguments);
    if (!this.store && this.mode == "local") {
     this.store = new Ext.data.ArrayStore({
      fields : [this.valueField, this.displayField],
      data : [],
      expandData : true,
      autoDestroy : true
     });
    }
   });
 });

 

 

 

 

 

 

以上的扩充,我们还扩充了Ext原有的数据结构,经过这个封装,我们可以很简单的为ComboBox设置初始数值。

 

原有的Ext初始化方法

new Ext.form.ComboBox({

  triggerAction : 'all',
  editable : false, 
  mode : 'local',
 name : "comboName",
  hiddenName :"comboName"
  valueField : 'value',
  displayField : 'text',

  store:[['val1','项目1'],['val2','项目2'],[ 'val3','项目3'],[ 'val4','项目4'],['val5','项目5']]

})

 

 

经过扩充后我们只需要简单的写成

 

new Ext.form.ComboBox({
 name : "comboName",
  store:{
    'val1':'项目1',
    'val2':'项目2',
    'val3':'项目3',
    'val4':'项目4',
    'val5':'项目5'
  }
})



 

 

 

修复Ext JS 3.1.1 Store  的一个BUG:
(PS:该BUG导致Store 的baseParams参数只有第一次更改时候生效。
BUG原因是Ext JS 只对lastOptions 进行了浅拷贝,解决方法使用深拷贝生成新的lastOptions 。)

 

Ext.override(Ext.data.Store, {
   storeOptions : function(o) {
      o = Ext.apply({}, o);
      delete o.callback;
      delete o.scope;
      this.lastOptions = Ext.decode(Ext.encode(o));
   }
});

 

你可能感兴趣的:(数据结构,prototype,ext)