ExtJS4:带有hasMany的模型只加载第一个嵌套属性

时间:2012-05-30 15:07:01

标签: extjs sencha-touch extjs4 sencha-touch-2

我尝试从我的服务器加载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"
      }]
}

我有两个模型如下:

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函数中检索的记录现在只包含一个登录数据集。我做错了什么吗?

谢谢! NIC

1 个答案:

答案 0 :(得分: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 here

希望这能让你走上正轨。