1

想请您帮忙理解 ExtJs4 如何扩展组件并解决以下问题。

ItemSelector通过扩展创建了自定义组件Ext.data.Grid,它具有_aSelectedItems属性。

Ext.define("Ext.ux.ItemSelector", {
    extend: "Ext.grid.Panel",

    // @type {Array}
    _aSelectedItems: [],
    ...
    getSelectedItems: function() {
        return this._aSelectedItems;
    },
});

组件

之后,我创建了两个使用ItemSelector小部件作为项目的组件:

Ext.define("components.Devices", {
    extend: "Ext.form.FieldContainer",
    _oDevicesSelector: null,
    ...
    _getSelector: function(oConfig) {
        if (!this._oDevicesSelector) {
            this._oDevicesSelector = new Ext.ux.ItemSelector({
                id: oConfig.id,
                name: oConfig.name,
                flex: 1,
                storeUrl: oConfig.storeUrl
            });
        }
        return this._oDevicesSelector;
    },

    getValue: function() {
        return this._getSelector().getSelectedItems();
    }
});

Ext.define("components.Firmwares", {
    extend: "Ext.form.FieldContainer",
    _oFirmwaresSelector: null,
    ...
    _getFirmwareSelector: function(oConfig) {
        if (!this._oFirmwaresSelector) {
            this._oFirmwaresSelector = new Ext.ux.ItemSelector({
                id: oConfig.id,
                name: oConfig.name,
                flex: 1,
                storeUrl: oConfig.storeUrl
            });
        }
        return this._oFirmwaresSelector;
    },

    getValue: function() {
        return this._getFirmwareSelector().getSelectedItems();
    }
});

ItemSelector在上面的每个组件中,我创建了through的新实例new

形式

我创建了一个表格,然后推components.Firmwarescomponents.Devices其中。一切正常,项目加载正确。

问题

当我选择一些项目components.Devices并打电话时,getValue()我会得到下一个结果:

console.log( this.getDevicesSelector().getValue() );
// ["7885"] - it's OK

console.log( this.getFirmwaresSelector().getValue() );
// ["7885"] - but this array should be empty, 
// 'cause I didn't select any items in components.Firmwares selector

谁能帮助我理解这种行为以及如何解决它?

真的提前感谢您的帮助。

4

1 回答 1

2

扩展组件/类时,非原始类型(如您的_aSelectedItems数组)在所有类实例之间共享。

关于为什么会发生这种奇怪的事情的完整解释可以在这篇 Skirtle's Den 文章中找到。您可能还想看看这个 SO question,并注意我对 Molecular Man 的回答的评论。

如果你把你的数组放在initComponent你的问题里应该没有了。

于 2012-12-25T17:24:31.813 回答