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"
      }]
}

我有两个模型,如下所示:

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-} })

但是我在成功函数中检索到的记录现在只包含一个登录数据集。我做错了什么吗?

谢谢!网卡

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 回答