2012-10-15 40 views
2

我尝试编写设置表单上所有字段的readOnly属性的方法。Extjs设置只读为表单上的所有字段

我的代码:

Ext.override(Ext.form.Panel,{ 

setReadOnlyForAll: function(bReadOnly) { 

    this.cascade(function(f) { 
     if (f.isFormField) { 
     f.setReadOnly(bReadOnly); 
     } 
    }); 
}); 

从Ext.form.Panel调用此方法:

this.setReadOnlyForAll(false); 

但这种方法的工作,以便slowly.Have别人的想法如何提高速度?谢谢!

回答

4

cascade检查当前容器的每个孩子(如Ext.form.Panel),这意味着您必须检查当前孩子是否是表单域。 因此,使用Ext.form.Basic.getFields方法让每一个表单字段:

Ext.define ('Your_form_Panel', { 
    extend: 'Ext.form.Panel' , 
    setReadOnlyForAll: function (bReadOnly) { 
    this.getForm().getFields().each (function (field) { 
     field.setReadOnly (bReadOnly); 
    }); 
    } 
}); 

更进一步,我建议你使用Ext.define,而不是Ext.override

+1

Wilk,非常感谢您!你的方法更快。 – vedmed

5

我还在使用Wilk的建议(使用ExtJS 4.1.1a)在窗体上(使用嵌套窗体)将~90个字段设置为只读约9秒。

为了进一步改进并从9秒减少到< 1秒钟,我添加了对Ext.suspendLayouts()和Ext.resumeLayouts()全局变量的调用,以允许框架对组件布局进行批处理。

Ext.define('My.Panel', { 
    extend: 'Ext.form.Panel', 

    setReadOnlyForAll: function(readOnly) { 
    Ext.suspendLayouts(); 
    this.getForm().getFields().each(function(field) { 
     field.setReadOnly(readOnly); 
    }); 
    Ext.resumeLayouts(); 
    } 
}); 
+0

恕我直言,这是正确的答案。反复做布局是这次行动的主要瓶颈...... –

1

这很简单。只需在您的表格中添加此配置:

  var formPanel = Ext.create('Ext.form.Panel', { 


       fieldDefaults: { 
        labelAlign: 'right', 
        labelWidth: 85, 
        msgTarget: 'side', 
        readOnly : true //all fiels are in readOnly mode 
       }, 

       defaultType: 'textfield', 

       items: [{ 
         fieldLabel: 'Nome', 
         name: 'nome' 
        }, { 
         fieldLabel: 'Cognome', 
         name: 'cognome' 
        } 
        ] 
       }], 

      });