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ウィジェットをアイテムとして使用する 2 つのコンポーネントを作成しました。

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.Firmwaresますcomponents.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配列など) はすべてのクラス インスタンス間で共有されます。

この奇妙なことが起こる理由の完全な説明は、このスカートルズ デンの記事にあります。この SO questionもご覧になり、Molecular Man's answer への私のコメントに注意してください。

アレイを問題内に配置するinitComponentと、問題は解決するはずです。

于 2012-12-25T17:24:31.813 に答える