Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Extjs动态设置窗体上所有字段的只读_Javascript_Extjs - Fatal编程技术网

Javascript Extjs动态设置窗体上所有字段的只读

Javascript Extjs动态设置窗体上所有字段的只读,javascript,extjs,Javascript,Extjs,我正在尝试编写一个方法,为表单上的所有字段设置只读属性 我的代码: Ext.override(Ext.form.Panel,{ setReadOnlyForAll: function(bReadOnly) { this.cascade(function(f) { if (f.isFormField) { f.setReadOnly(bReadOnly); } }); }); 从Ext.form.Panel调用此方法: this.se

我正在尝试编写一个方法,为表单上的所有字段设置只读属性

我的代码:

Ext.override(Ext.form.Panel,{

setReadOnlyForAll: function(bReadOnly) {

    this.cascade(function(f) {
      if (f.isFormField) {
         f.setReadOnly(bReadOnly);
      }
    });
});
从Ext.form.Panel调用此方法:

this.setReadOnlyForAll(false); 

但是这个方法太慢了。有人知道如何提高速度吗?谢谢大家!

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

根据Wilk的建议(使用ExtJS 4.1.1a),在表单(使用嵌套表单)上将90个字段设置为只读时,我仍然经历了9秒的延迟

为了进一步改进这一点,并将时间从9秒减少到<1秒,我添加了对Ext.suspendLayouts()和Ext.resumealayouts()全局函数的调用,以允许框架批处理组件布局

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

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

很简单。只需在表单中添加此配置:

            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'
                    }
                    ]
                }],

            });

我想这是正确的答案。重复进行布局是此操作的主要瓶颈。。。