0

Ext.draw.Component を拡張する Sencha クラスがあり、MyModel のストアを受け入れます。2 つの異なる方法を試していますが、異なる満足のいく結果が得られません。

クラスのコンストラクター内の最初のメソッド
ストアで読み取り、次のことを行います。

//Inside constructor of the class
this.store = config.store; //config is passed in from the constructor
var me = this;
me.store.each(function (model) {
    me.renderTo = model.get('elementToRenderTo');
    me.items = [{
        type: 'rect',
        x: 1.6620979,
        y: 52.362183,
        radius: 90,
        width: 448.10959,
        height: 1000,
        fill: model.get('color'),
        stroke: 'none'    
    }];

    if (me.items) {
        Ext.apply(config, { //config is passed in from the constructor
            items: me.items
        });
    }

    me.callParent([config]);
}

最後のコードをある場所 (store.each 内) に配置すると、例外が発生します。

キャッチされていない TypeError: 未定義のメソッド 'apply' を呼び出せません

2 番目の方法
ただし、Ext.apply と callParent を store.each の外に移動すると、予期せず、最後のモデルのみが描画されます (おそらく me.items が各反復で上書きされるため)モデル)。

//Inside constructor of the class
this.store = config.store; //config is passed in from the constructor
var me = this;
me.store.each(function (model) {
    me.renderTo = model.get('elementToRenderTo');
    me.items = [{
        type: 'rect',
        x: 1.6620979,
        y: 52.362183,
        radius: 90,
        width: 448.10959,
        height: 1000,
        fill: 'black',
        stroke: 'none'    
    }];
}

if (me.items) {
    Ext.apply(config, { //config is passed in from the constructor
        items: me.items
    });
}

me.callParent([config]);

ストアを使用するカスタム Ext.draw.Component を作成する別の方法はありますか? 私は何が欠けていますか?2 番目の方法は正しくないようですが、最初の方法では例外を取り除くことができません。

4

1 に答える 1

1

このコードにはいくつかの問題が考えられます。

1

this.store = config.store;

これはストア インスタンスですか、それとも文字列構成ですか? コンストラクターでストア構成を処理する適切な方法は次のとおりです。

this.store = Ext.data.StoreManager.lookup(this.store || 'ext-empty-store');        

2

スコープに使用していますが、おそらくスコープが実際にその外側にあるものであることmeを確認したいでしょう:each

me.store.each(function (model) { ... }, this);

3

これを行う場所に関係なく、すべてのアイテムをプッシュするわけではありません。

Ext.apply(config, {
    items: me.items
});

ここで行うことは、オーバーライドitemを維持するためme.itemsです。

アイテムには何も適用しないでください。これは、コンポーネント自体によって管理される配列です。代わりに、アイテムを実際に追加する必要があります。

items.push( me.items )

4

ローカルストアのみを想定していますか?ストアが非同期にロードされる場合、ロード時にアイテムをロードしない限り、何も得られないためです。

5

ここで実際に何をしようとしていますか?商品はストアからロードされましたか? そのような場合は、コンストラクターでそれを行うべきではありません。

Ext ソース ファイルの 1 つを実際に見て、これがどのように行われるかを確認する必要があります。Ext.panel.Tableがどのようにそれを行うかを簡略化したバージョンを次に示します。

Ext.define('Ext.panel.Table', {
    extend: 'Ext.panel.Panel',

    initComponent: function() {
        var me          = this,
            store       = me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');

        me.mon(store, {
            load: me.onStoreLoad,
            scope: me
        });
    },

    onStoreLoad: function() {
    }
});
于 2013-03-08T20:23:11.477 に答える