4

ここに示すように、親ストアと子ストアがあります。

親モデル

Ext.define('APP.model.Client', {
    extend: 'Ext.data.Model',
    requires: [
        'APP.model.Website', 'Ext.data.association.HasMany', 'Ext.data.association.BelongsTo'],
    fields: [{
        name: 'id',
        type: 'string'
    }, {
        name: 'name',
        type: 'string'
    }, {
        name: 'slug',
        type: 'string'
    }, {
        name: 'active',
        type: 'boolean'
    }, {
        name: 'current',
        type: 'boolean'
    }],
    hasMany: {
        model: 'APP.model.Website',
        name: 'websites'
    }
});

子モデル

Ext.define('APP.model.Website', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'id',
        type: 'string'
    }, {
        name: 'client_id',
        type: 'string'
    }, {
        name: 'sub_domain',
        type: 'string'
    }, {
        name: 'active',
        type: 'boolean'
    }],
    belongsTo: 'APP.model.Client'
});

サーバー経由で AJAX 呼び出しを使用して、Clientsストアをロードしていますが、正常にロードされています。しかし、ストアにはデータが取り込まれていません。ストアの on.load 関数Websitesにブレークポイントを設定して、何が取り込まれているかを確認すると、ストアにはクライアント データのみが取り込まれますが、そのストアのプロパティでは、すべてのデータを確認できます。データ。正しく返されていますが、extjs が正しくありません。店舗は次のとおりです。ClientsClientrawwebsites

クライアントストア

Ext.define('APP.store.Clients', {
    extend: 'Ext.data.Store',
    autoLoad: false,
    model: 'APP.model.Client',
    proxy: {
        type: 'ajax',
        url: '/client/list',
        reader: {
            type: 'json',
            root: 'items'
        }
    },
    sorters: [{
        property: 'name',
        direction: 'ASC'
    }]
});

ウェブサイト ストア

Ext.define('APP.store.Websites', {
    extend: 'Ext.data.Store',
    requires: ['Ext.ux.Msg'],
    autoLoad: false,
    model: 'APP.model.Website',
    proxy: {
        type: 'ajax',
        url: '/client/list',
        reader: {
            type: 'json',
            root: 'items'
        },
        writer: {
            type: 'json'
        }
    },
    sorters: [{
        property: 'sub_domain',
        direction: 'ASC'
    }]
});

私の最終的な結果は...要素をクリックできるように両方のストアにデータを入力したいのですが、親ストアから何かをロードすると、子ストアにアクセスできます(見つけたらもっとあります)この問題) タブにいくつかのグリッドを設定します。

セットアップに関して何が欠けていますか? 数日前に extjs4 をダウンロードしたばかりなので、4.1 を使用しています。

4

2 に答える 2

12

正当な理由がない限り、モデルにプロキシを入れてください[1]

require関連するモデルが同じファイル内またはアプリケーションの前にあることを確認してください

foreignKey関連するデータを自由にロードしたい場合に使用します (つまり、後のネットワーク要求で)。

associationKey関連するデータが同じ (ネストされた) 応答で読み込まれる場合に使用します

または、両方を使用する

常にnameあなたの関係 (そうしないと、名前空間を使用すると名前が変になります)。

リレーションシップのプロパティには常に完全修飾モデル名を使用してくださいmodel

作業コード:

model/Contact.js:

Ext.define('Assoc.model.Contact', {
    extend:'Ext.data.Model',

    requires:[
    'Assoc.model.PhoneNumber' 
    ],

    fields:[
    'name' /* automatically has an 'id' field */
    ],

    hasMany:[
    {
        model:'Assoc.model.PhoneNumber', /*use the fully-qualified name here*/
        name:'phoneNumbers', 
        foreignKey:'contact_id',
        associationKey:'phoneNumbers'
    }
    ],

    proxy:{
    type:'ajax',
    url:'assoc/data/contacts.json',
    reader:{
        type:'json',
        root:'data'
    }
    }
});

model/PhoneNumber.js:

Ext.define('Assoc.model.PhoneNumber', {
    extend:'Ext.data.Model',

    fields:[
    'number',
    'contact_id'
    ],

    proxy:{
    type:'ajax',
    url:'assoc/data/phone-numbers.json',
    reader:{
        type:'json',
        root:'data'
    }
    }
});

データ/contacts.json:

{
    "data":[
    {
    "id":1,
    "name":"neil",
    "phoneNumbers":[
    {
        "id":999,
        "contact_id":1,
        "number":"9005551234"
    }
    ]
    }
    ]

}

データ/電話番号.json

{
    "data":[
    {
    "id":7,
    "contact_id":1,
    "number":"6045551212"
    },
    {
    "id":88,
    "contact_id":1,
    "number":"8009996541"
    },
    ]

}

app.js:

Ext.Loader.setConfig({
    enabled:true
});

Ext.application({

    requires:[
    'Assoc.model.Contact'
    ],

    name:'Assoc',
    appFolder:'Assoc',

    launch:function(){

    /* load child models that are in the response (uses associationKey): */
    Assoc.model.Contact.load(1, {
        success: function(record){
        console.log(record.phoneNumbers());
        }
    });

    /* load child models at will (uses foreignKey). this overwrites child model that are in the first load response */
    Assoc.model.Contact.load(1, {
        success: function(record){
        record.phoneNumbers().load({
            callback:function(){
            console.log(arguments);
            }
        });
        }
    });

    }
});

[1] ストアはそのモデルのプロキシを使用します。必要に応じて、いつでもストアのプロキシをオーバーライドできます。モデルにプロキシがない場合は、Model.load() を使用できません。

于 2012-05-25T18:22:57.537 に答える
0

あなたの仮定は間違っています。WebSite ストアが自動的に読み込まれることを期待していますが、それは機能しません。あなたができることは次のとおりです(これはテストされていませんが、すべてのプロジェクトで私が行う方法です):

クライアント グリッドで、itemclick イベントのリスナーを追加して、次のメソッド (showWebSites) を呼び出します。選択した APP.model.Client インスタンスを含む、選択したクライアント レコードを受け取ります。次に、各クライアントに一連の Web サイトがある場合、メソッドは APP.store.Websites ストアをロードし、クライアントの Web サイトがビューに表示されます。

showWebSites: function (sender, selectedClient) {
    Ext.StoreManager.lookup('APP.store.Websites')
       .loadData(selectedClient.data.WebSites);
}

これが道です。お役に立てば幸いです。

于 2012-05-25T05:45:25.887 に答える