1

モデルのロード機能を介して、ネストされた属性を持つサーバーから JSON 応答をロードしようとしました。しかしどういうわけか、ネストされた属性セットの最初のエントリだけが解析されます。

次のような JSON ファイルを読み込もうとしています。

{
   "id" : "2",
   "name" : "John",
   "logins" : [
      {
         "id" : "4",
         "person_id" : "2",
         "date" : "2012-01-18 01:00:06"
      },{
         "id" : "9",
         "person_id" : "2",
         "date" : "2012-01-18 19:36:13"
      },{
         "id" : "12",
         "person_id" : "2",
         "date" : "2012-01-19 00:12:32"
      }]
}

私は次のような2つのモデルを持っています:

Ext.define('MyAppName.model.Person', {
    extend : 'Ext.data.Model',
    config : {
        idProperty : 'id',
        fields : [{
                    name : 'id',
                    type : 'int'
                }, {
                    name : 'name',
                    type : 'string'
                }],
        hasMany : [{
                model: 'MyAppName.model.Login',
                name: 'logins',
                associationKey: 'logins'
        }],
        proxy : {
            type : 'ajax',
            url : '../index.php?format=json',
            reader : {
                type : 'json'
            }
        }
    }
});

Ext.define('MyAppName.model.Login', {
    extend : 'Ext.data.Model',
    config : {
        fields : [{
                    name : 'id',
                    type : 'int'
                }, {
                    name : 'person_id',
                    type : 'int'
                }, {
                    name : 'date',
                    type : 'date'
                }],
        belongsTo: [{
            model: 'MyAppName.model.Person', 
            associationKey: 'logins'
        }]  
    }
});

そして、新しい人にそのデータをロードしようとします

MyAppName.model.Person.load(personId, {scope: ..., ..., success: function(record, operation) { -someFancyCode-} })

しかし、success 関数で取得したレコードには、ログイン データセットが 1 つしか含まれていません。私は何か間違ったことをした?

ありがとう!ニック

4

1 に答える 1

1

まず第一に、モデルはネストされたデータを単独でロードしません。少なくとも、それには既知の問題がいくつかあります。そのため、より良い選択は、ストアを作成し、そのストアを介してモデルをロードすることです。これらの行:

Ext.define('MyAppName.model.Person', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [{
        name: 'id',
        type: 'int'
    }, {
        name: 'name',
        type: 'string'
    }],
    hasMany: [{
        model: 'MyAppName.model.Login',
        name: 'logins'
    }],
    proxy: {
        type: 'memory',
        reader: {
            type: 'json'
        }
    }
});

Ext.define('MyAppName.model.Login', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'id',
        type: 'int'
    }, {
        name: 'person_id',
        type: 'int'
    }, {
        name: 'date',
        type: 'date'
    }],
    belongsTo: [{
        model: 'MyAppName.model.Person'
    }]
});
var data = {
    "id": "2",
    "name": "John",
    "logins": [{
        "id": "4",
        "person_id": "2",
        "date": "2012-01-18 01:00:06"
    }, {
        "id": "9",
        "person_id": "2",
        "date": "2012-01-18 19:36:13"
    }, {
        "id": "12",
        "person_id": "2",
        "date": "2012-01-19 00:12:32"
    }]
};
var store = Ext.create('Ext.data.Store', {
    model: 'MyAppName.model.Person',
    data: data
});
var instanceModel = store.getAt(0);
//Show 'Person' model contents.
console.info(instanceModel);

//Show 'logins' for that person
console.info(instanceModel.logins());

ここで対応するJsFiddle を確認してください

これが正しい軌道に乗ることを願っています。

于 2013-01-08T20:50:45.810 に答える