`
Liu_wh
  • 浏览: 18020 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Ext2的一些扩展

阅读更多
本文转贴

extjsHacker.js
=============

//Extjs 2.X
//为grid ColumnModel 的renderer增加gridView的引用
//
Ext.grid.GridView.prototype.doRender = function(cs, rs, ds, startRow, colCount, stripe){
        var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
        var tstyle = 'width:'+this.getTotalWidth()+';';
        // buffers
        var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;
        for(var j = 0, len = rs.length; j < len; j++){
            r = rs[j]; cb = [];
            var rowIndex = (j+startRow);
            for(var i = 0; i < colCount; i++){
                c = cs[i];
                p.id = c.id;
                p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
                p.attr = p.cellAttr = "";
                p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds,this);
                p.style = c.style;
                if(p.value == undefined || p.value === "") p.value = "&#160;";
                if(r.dirty && typeof r.modified[c.name] !== 'undefined'){
                    p.css += ' x-grid3-dirty-cell';
                }
                cb[cb.length] = ct.apply(p);
            }
            var alt = [];
            if(stripe && ((rowIndex+1) % 2 == 0)){
                alt[0] = "x-grid3-row-alt";
            }
            if(r.dirty){
                alt[1] = " x-grid3-dirty-row";
            }
            rp.cols = colCount;
            if(this.getRowClass){
                alt[2] = this.getRowClass(r, rowIndex, rp, ds);
            }
            rp.alt = alt.join(" ");
            rp.cells = cb.join("");
            buf[buf.length] =  rt.apply(rp);
        }
        return buf.join("");
    }

//extjs 2.x 
/**
 * 为combobox添加lookup
 * @param {} v
 * @param {} rec
 */
Ext.form.ComboBox.prototype.setValue = function(v,rec){
       var text = v;

        if(this.valueField){
            var r = this.findRecord(this.valueField, v);

            if(r){
                text = r.data[this.displayField];
            }else if(this.valueNotFoundText !== undefined){
                text = this.valueNotFoundText;
            }
        }
        //添加lookup
        if (rec && this.record && text) {  
              if(this.lookup){
                  for(var i = 0 ; i<this.lookup.length ; i++){
                      this.record.set(this.lookup[i][0],rec.get(this.lookup[i][1]));
                  }
              }
         }
         
        this.lastSelectionText = text;
        if(this.hiddenField){
            this.hiddenField.value = v;
        }
        Ext.form.ComboBox.superclass.setValue.call(this, text);
        this.value = v;
    };
    
//extjs 2.x
/**
 * 为gridEditor添加行数据引用
 * @param {} el
 * @param {} value
 */
Ext.grid.GridEditor.prototype.startEdit = function(el, value){  
         if(this.editing){  
             this.completeEdit();  
         }  
         this.boundEl = Ext.get(el);  
         var v = value !== undefined ? value : this.boundEl.dom.innerHTML;  
         if(!this.rendered){  
             this.render(this.parentEl || document.body);  
         }  
         if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){  
             return;  
         }  
         //alert(this.field);
         this.startValue = v;  
         this.field.record = this.record;//就加入这一行,让field中获得当前数据行  
         this.field.setValue(v);  
         this.doAutoSize();  
         this.el.alignTo(this.boundEl, this.alignment);  
         this.editing = true;  
         this.show();  
     } 
    
//extjs 2.x  Ext.lib.Ajax
/**
 * 添加同步ajax
 * @param {} method
 * @param {} uri
 * @param {} callback
 * @param {} postData
 * @return {}
 */     
Ext.lib.Ajax.syncRequest = function(method, uri, callback, postData) {
    
            var o = this.getConnectionObject();

            if (!o) {
                return null;
            }
            else {
                o.conn.open(method, uri, false);

                if (this.useDefaultXhrHeader) {
                    if (!this.defaultHeaders['X-Requested-With']) {
                        this.initHeader('X-Requested-With', this.defaultXhrHeader, true);
                    }
                }

                if(postData && this.useDefaultHeader && (!this.hasHeaders || !this.headers['Content-Type'])){
                    this.initHeader('Content-Type', this.defaultPostHeader);
                }

                 if (this.hasDefaultHeaders || this.hasHeaders) {
                    this.setHeader(o);
                }

                this.handleReadyState(o, callback);
                o.conn.send(postData || null);

                return o;
            }
        };
        
//extjs 2.x  Ext.lib.Ajax  
/**
 * 添加同步ajax
 * @param {} method
 * @param {} uri
 * @param {} cb
 * @param {} data
 * @param {} options
 * @return {}
 */        
Ext.lib.Ajax.request = function(method, uri, cb, data, options) {
            if(options){
                var hs = options.headers;
                if(hs){
                    for(var h in hs){
                        if(hs.hasOwnProperty(h)){
                            this.initHeader(h, hs[h], false);
                        }
                    }
                }
                if(options.xmlData){
                    if (!hs || !hs['Content-Type']){
                        this.initHeader('Content-Type', 'text/xml', false);
                    }
                    method = (method ? method : (options.method ? options.method : 'POST'));
                    data = options.xmlData;
                }else if(options.jsonData){
                    if (!hs || !hs['Content-Type']){
                        this.initHeader('Content-Type', 'application/json', false);
                    }
                    method = (method ? method : (options.method ? options.method : 'POST'));
                    data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;
                }
            }
            if ("sync" in options) return this.syncRequest(method, uri, cb, data);
            return this.asyncRequest(method, uri, cb, data);
        };   

//extjs 2.x 自动重连
/**
 * Ext.Ajax.request({
   url: 'foo.jsp',
   timeout:2,
   
   //重连次数
   retryCount:3,
   
   //重连后要注意保存新的 newTransactionId
   retry:function(retryCount,newTransactionId){
       
       alert('failture remain retry count :' + retryCount+'\n'
       +'newTransactionId : '+newTransactionId.tId);
   },
   
   //最终的失败函数
   failure: function(responseObject){
      alert('failture finally :'+responseObject.statusText);
   },
   headers: {
       'my-header': 'foo'
   },
   params: { foo: 'bar' }
});
*/
(function(){
    //保存原来的调用代码
    var oldRequest=Ext.lib.Ajax.request;
    //新的增强代码
    Ext.lib.Ajax.request = function(method, uri, cb, data, options) {
        //没有配置就运行老代码
        if(!options.retryCount) 
            return oldRequest.call(Ext.lib.Ajax,method, uri, cb, data, options);
        
        //保存原来的失败处理函数
        var oldFailure=cb.failure;
        //添加了自动重连的新的处理函数
        cb.failure=function(responseObject){
            options.retryCount--;
            if(options.retryCount) {
                //注意:自动重连后tId 变化
                var newTransactionId = oldRequest.call(Ext.lib.Ajax,method, uri, cb,data, options);
                //调用重连回调函数
                if(options.retry) {
                    options.retry.apply(cb.scope||window, [options.retryCount,newTransactionId]);
                }
            }    
            //重连够了,调用真正的失败函数。
            else if(oldFailure){
                oldFailure.apply(cb.scope||window, [responseObject]);
            }
        }
        
        //增强配置,再运行老代码
        return oldRequest.call(Ext.lib.Ajax,method, uri, cb, data, options);
                
    }
    
})();        
        
//extjs 2.x
/**
 * 为form添加当前数据record
 * @param {} values
 * @return {}
 */
Ext.form.BasicForm.prototype.setValues = function(values){
        this.data = values; //添加数据引用,用于以后使用
        if(Ext.isArray(values)){ // array of objects
            for(var i = 0, len = values.length; i < len; i++){
                var v = values[i];
                var f = this.findField(v.id);
                if(f){
                    f.setValue(v.value);
                    if(this.trackResetOnLoad){
                        f.originalValue = f.getValue();
                    }
                }
            }
        }else{ // object hash
            var field, id;
            for(id in values){
                if(typeof values[id] != 'function' && (field = this.findField(id))){
                    field.setValue(values[id]);
                    if(this.trackResetOnLoad){
                        field.originalValue = field.getValue();
                    }
                }
            }
        }
        return this;
    }        
    
    
//Extjs 2.x 
Ext.FormPanel.prototype.initFields = function(){
        var f = this.form;
        var formPanel = this;
        var fn = function(c){
            if(c.isFormField){
                c.form = formPanel; //为录入控件添加form的引用
                f.add(c);
            }else if(c.doLayout && c != formPanel){
                Ext.applyIf(c, {
                    labelAlign: c.ownerCt.labelAlign,
                    labelWidth: c.ownerCt.labelWidth,
                    itemCls: c.ownerCt.itemCls
                });
                if(c.items){
                    c.items.each(fn);
                }
            }
        }
        this.items.each(fn);
    }

//Extjs 2.x
Ext.FormPanel.prototype.beforeDestroy = function(){
        var fn=function(c){
            if (c.isFormField) {
                if(c.form) {
                    c.form=null;
                    delete c.form;
                }
            }
            if(c.items){
                c.items.each(fn);
            }
        };
        this.items.each(fn);
        Ext.FormPanel.superclass.beforeDestroy.call(this);
        this.stopMonitoring();
        Ext.destroy(this.form);
    }    
    
Ext.override(Ext.form.BasicForm, {
  setReadOnly: function(bReadOnly){
    this.items.each(function(f)
    {
      if (f.isFormField)
      {
        f.getEl().dom.readOnly = bReadOnly;                
        // Remove click event handlers
        if (f instanceof Ext.form.TriggerField)        
        {
          if (bReadOnly)
            f.trigger.un('click', f.onTriggerClick, f)
          else
            f.trigger.on('click', f.onTriggerClick, f, {preventDefault:true});
          
          if (f instanceof Ext.form.ComboBox) //Alternatively, to check if combobox use: if (f.setEditable)...
          {
              if(f.view){
                if (bReadOnly){
                    f.view.un('click', f.onViewClick, f)
                }
                else{
                    f.view.on('click', f.onViewClick, f);
                }
              }
          }
        }
      }
    });    
  }
}); 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics