6

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

我的代码:

Ext.override(Ext.form.Panel,{

setReadOnlyForAll: function(bReadOnly) {

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

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

this.setReadOnlyForAll(false); 

但是这种方法工作得很慢。有人知道如何提高速度吗?谢谢!

4

3 回答 3

7

根据 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();
  }
});
于 2013-01-31T14:31:11.267 回答
6

cascade检查当前容器的每个子项(例如 an 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.

于 2012-10-15T17:28:59.830 回答
2

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

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

            });
于 2014-11-12T17:04:31.457 回答