Javascript ExtJS 3.4更改一次在多个显示字段上设置相同的值

Javascript ExtJS 3.4更改一次在多个显示字段上设置相同的值,javascript,extjs,extjs3,Javascript,Extjs,Extjs3,在ExtJS3.4中,我需要在多行表单布局上显示一些值。每行显示如下: <label> <field> <unit of measure> var dispF = new Ext.form.DisplayField({ value:'liters' }); var row1 = new Ext.form.CompositeField({ ... items: [<some numberfield 1>, dispF]

在ExtJS3.4中,我需要在多行表单布局上显示一些值。每行显示如下:

<label> <field> <unit of measure>
var dispF = new Ext.form.DisplayField({
    value:'liters'
});
var row1 = new Ext.form.CompositeField({
    ...
    items: [<some numberfield 1>, dispF]
    ...
});
var row2 = new Ext.form.CompositeField({
    ...
    items: [<some numberfield 2>, dispF]
    ...
});
//Calling this by some means
dispF.setValue('m^3');
但是,dispF将仅在最后一个实例化的元素上呈现,该元素在本例中使用了row2

我还尝试了以下方法:

var t = 'liters';
var dispF = {
    xtype:'displayfield',
    value:t
};
var row1 = new Ext.form.CompositeField({
    ...
    items: [<some numberfield 1>, dispF]
    ...
});
var row2 = new Ext.form.CompositeField({
    ...
    items: [<some numberfield 2>, dispF]
    ...
});
...
//Calling this by some means
t='m^3';
在本例中,“L”将被渲染到所有行的正确位置,但不会更改为“m^3”

我不想在这个问题上使用网格

手动处理每个字段可能有点困难,因为行很多,实际上可能包含多个字段和度量单位组,而将它们存储在数组中会使代码更难读懂,因为这里必须考虑代码的可读性


是否有一种方法可以通过只执行一个操作来更新每一行中的显示字段,例如赋值、调用setValue,…,而不是为每一行声明并实例化一个显示字段,然后在每一行上调用setValue?

下一个解决方案可能会帮助您。这里的不同之处在于,值是通过一个用户定义的函数调用而不是一个操作更改的。 但使用此解决方案,您不需要为每个displayfield对象保留引用或将它们存储在数组中

解决方案中的步骤是:创建displayfield子类和用户定义的函数:

Ext.onReady(function(){
    // Class definition.
    TestDisplayField = Ext.extend(Ext.form.DisplayField, {
        constructor: function(config) {
            TestDisplayField.superclass.constructor.call(this, config);
        },
    });
    Ext.reg('testdisplayfield', TestDisplayField);

    // Global setter function.
    function setTestDisplayFieldValues(container, value, xtype) {
        var items = container.items;
        for (var i = 0; i < items.length; i++) {
            var component = items.get(i);
            if (Ext.isDefined(component.items)) {
                setTestDisplayFieldValues(component, value, xtype)
            } else {
                if (component.xtype == xtype) {
                    component.setValue(value);
                }
            }
        }
    };

    // Components. 
    // Here are 'displayfield' and 'tesdisplayfield' components just for test.
    var row1 = new Ext.form.CompositeField({
        items: [
            {xtype: 'numberfield', width: 50}, {xtype: 'displayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'displayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'testdisplayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'testdisplayfield', value : 'liters', width: 100}
        ]
    });
    var row2 = new Ext.form.CompositeField({
        items: [
            {xtype: 'numberfield', width: 50}, {xtype: 'displayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'displayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'testdisplayfield', value : 'liters', width: 100},
            {xtype: 'numberfield', width: 50}, {xtype: 'testdisplayfield', value : 'liters', width: 100}
        ]
    }); 

    // Form 
    Ext.create(
        {
        xtype: 'form',
        id: 'testform',
        renderTo: Ext.getBody(),
        title: 'Image', 
        width: 600,
        height: 300,
        layout: 'vbox',
        items: [
            row1,
            row2
        ],
        buttons: [
            {
            text: 'Set value',
            handler: function(button) {
                // Change the values of all 'testdisplayfield' components.
                // Here you can use 'displayfield' as xtype if all you components are 'displayfield' and must be changed.
                // In this case it's not necessary to define 'TestDisplayField' class.
                setTestDisplayFieldValues(Ext.getCmp('testform'), 'm^3', 'testdisplayfield');
            }
            }
        ]
    });
});
注:


通过使用ExtJS 3.4进行测试,我想到在DisplayField配置中添加一个onRender侦听器,将每个字段添加到一个数组中,然后在需要更改值时在该数组上循环,从而保证该数组只包含从该配置实例化的元素。然而,对于听众来说,这听起来很沉重,他们只需要被解雇一次。建议的解决方案感觉更紧凑,而且,即使递归地探索DOM树,它看起来也不会太重。此外,用户不会每半秒钟更改一次单位。被认为是正确答案。非常感谢。