2

ExtJS4 のドキュメントに戻って、例の行を 1 行ずつコピーして、どこが間違っている可能性があるかをトラブルシューティングしようとした後、困惑しました。initComponent が不運な操作順序になっている問題を嗅ぎ回っています。

定義されているストアは、1) フィールドに入力されておらず、2) フィールド リスナーから呼び出しを試みた後、未定義であると言われています。

initComponentでストアを定義していますが、

Ext.define('X.view.NewLogWindow', {
extend: 'Ext.window.Window',
xtype:'newlogwindow',
itemId: 'newLogWindow',
width: 300,
height: 140,
modal: true,
title: 'Create Log',
layout: 'fit',
initComponent: function() {

    this.monthStore = Ext.create('Ext.data.Store', {
        fields : [
            {name : 'id', type : 'int'}, {name : 'month', type : 'string'}
        ],
        autoLoad: true,
        data : [
            {"id" : 0, "month" : "January"},
            {"id" : 1, "month" : "February"},
            {"id" : 2, "month" : "March"},
            {"id" : 3, "month" : "April"},
            {"id" : 4, "month" : "May"},
            {"id" : 5, "month" : "June"},
            {"id" : 6, "month" : "July"},
            {"id" : 7, "month" : "August"},
            {"id" : 8, "month" : "September"},
            {"id" : 9, "month" : "October"},
            {"id" : 10, "month" : "November"},
            {"id" : 11, "month" : "December"}
        ]
    });

    var x = 'fixme';

    console.log(this.monthStore);
    console.log(x);


    this.callParent();


}

次に、フォーム パネルのコンボボックスにストアを次のように割り当てています。

items: [
    {
        xtype: 'form',
        margin: 10,
        border: false,
        defaults: {allowBlank: false},
        items: [
            {
                xtype: 'combobox',
                fieldLabel: 'Log Month',
                store: this.monthStore,
                queryMode : 'local',
                displayField: 'month',
                valueField: 'id',
                listeners: {blur: function(field)
                {
                    console.log(this.monthStore);
                    console.log(this.x);
                    }

                }
            }
        ]
    }
]

コンソール ロギングからの出力は次のとおりです。

constructor NewLogWindow.js:40
fixme NewLogWindow.js:41
undefined NewLogWindow.js:74
undefined NewLogWindow.js:75

前もって感謝します。

4

2 に答える 2

1

あなたが苦労しているのは、「この」コンテキストのスコーピングです。コンソール出力にブレークポイントを設定し、「this」オブジェクトを検査します。それはあなたを正しい道に導くでしょう。

于 2012-05-21T22:27:31.863 に答える
1

storeId 構成を使用するだけで、ストアのハンドルを取得できます。たとえば、次のようになります。

initComponent: function() {

    Ext.create('Ext.data.Store', {
        storeId: 'months',
        fields : [
            {name : 'id', type : 'int'}, {name : 'month', type : 'string'}
        ],
        autoLoad: true,
        data : [
            {"id" : 0, "month" : "January"},
            {"id" : 1, "month" : "February"},
            {"id" : 2, "month" : "March"},
            {"id" : 3, "month" : "April"},
            {"id" : 4, "month" : "May"},
            {"id" : 5, "month" : "June"},
            {"id" : 6, "month" : "July"},
            {"id" : 7, "month" : "August"},
            {"id" : 8, "month" : "September"},
            {"id" : 9, "month" : "October"},
            {"id" : 10, "month" : "November"},
            {"id" : 11, "month" : "December"}
        ]
    });

// etc...

次に、使用store: Ext.StoreManager.lookup('months')して必要な場所に割り当てることができます。

またinitComponent、コンポーネント内の静的データが処理された後に呼び出されることに注意してください。上記の 2 番目のコード ブロックをどこで実行しているのかわかりません。initComponentただし、ストアが作成された後、つまりinitComponentが呼び出された後に作成したストアを使用するには、そのコンボを作成する必要があります。initComponentストアを作成した直後に、次のようなことができます。

this.items = [{
    xtype: 'form',
    margin: 10,
    border: false,
    defaults: {allowBlank: false},
    items: [{
        xtype: 'combobox',
        fieldLabel: 'Log Month',
        store: Ext.StoreManager.lookup('months'),
        queryMode : 'local',
        displayField: 'month',
        valueField: 'id',
        listeners: {
            blur: function(field) {
                console.log(this.monthStore);
                console.log(this.x);
            }
        }
    }]
}];

複数のビューで使用できる参照ストアがある場合に行うもう 1 つのことは、コントローラーで作成することです。次に、ビューのインスタンスを作成すると、既にそれが利用可能になり、StoreManager.lookup上記の呼び出しを実行できます。

于 2012-05-22T01:57:05.540 に答える