0

これが私のモデルです:

Ext.define('Email', {
    extend: 'Ext.data.Model',
    idProperty: 'emailid',
    fields: [
        { name: 'emailid', type: 'int' },
        { name: 'emailsubject', type: 'string', useNull: true },
        { name: 'emailbody', type: 'string', useNull: true },
        { name: 'emailto', type: 'string', useNull: true },
        { name: 'emailfrom', type: 'string', useNull: true },
    ]
});

およびデータストア:

var EmailDataStore = {

    getDetailStore: function(aid) {    

        var options =  {
            autoLoad: true,
            autoSync: true,
            pageSize: 1,
            remoteFilter: true,
            remoteGroup: true,
            remoteSort: true,
            model: 'Email',
            proxy: {
                type: 'ajax',
                url: 'datastores/datastore-email.asp?action=details&auditid=' + aid,
                reader: {
                    type: 'json',
                    root: 'emailDetails'
                }
            }
        };

        if (typeof (options2) != 'undefined') {
            options = Ext.merge(options, options2);
        }

        var detailStore = Ext.create('Ext.data.Store', options);
        return detailStore;
    }
}

JSONがデータを適切に返すため、ASPは含めません。しかし、この次のコードでは、

...
PortalEmailGrid.prototype.detailStore = null;
PortalEmailGrid.prototype.showEmailDetails = function (id) {
    var self = this;
    //alert(id);
    self.detailStore = EmailDataStore.getDetailStore(id);
    //view store at this state - object appears to exist with the returned record in it
    console.log(self.detailStore);

    var firstItem = self.detailStore.first();
    //undefined here
    console.log(firstItem);
    //count is zero, but i can see the object in the console log above
    alert('detailStore count: ' + self.detailStore.count());

    var win = Ext.create('Ext.window.Window', {
        title: 'Email Details',
        store: self.detailStore,
        height: 400,
        width: 800,
        bodyPadding: 4,
        items: [
            {
                xtype: 'textfield',
                name: 'tofield',
                dataIndex: 'emailto',
                fieldLabel: 'To'
            },
                                {
                xtype: 'textfield',
                name: 'subjectfield',
                dataIndex: 'emailsubject',
                fieldLabel: 'Subject'
            }

        ]
    });

    win.show();
}

フィールドにのデータを入力できませんdetailStore。しかしself.detailStore、Firebugにログインすると、オブジェクトとその詳細を確認できます。self.detailStore.count()はゼロを示していますが、コンソールによると、データはそこにあるはずです。この不一致のために、フィールドにdataIndex情報が入力されていないのではないかと思います。また、前のコードブロックは次の人によって呼び出されました。

var selected = self.grid.selModel.selected;
var id = selected.items[0].raw.emailid;
//var status = selected.items[0].raw.status;
PortalEmailGrid.prototype.showEmailDetails(id);

データがデータストアから読み込まれない理由がわかりますか?

4

1 に答える 1

1

ストアの読み込みは非同期です。カウントをコンソールに記録する時点では、ストアはまだ読み込まれていません。Firebugは常にオブジェクトの「最新」ステータスを表示します。そのため、データを表示できます。ストアでロードイベントをリッスンする必要があります。

したがって、autoLoad構成を削除すると、次のようなことができます。

self.detailStore = EmailDataStore.getDetailStore(id);
self.detailStore.load({
    callback: function(){
        console.log('loaded, do something');
    }
});
于 2013-02-13T21:09:59.790 に答える