使用嵌套JSON填充关联模型

and*_*nes 1 model extjs store extjs4

我有以下数据:

var data = [
    {
        id: 1,
        name: 'Ed Spencer',
        phoneNumber: '555 1234',
        children: [{
          id: 11,
          name: 'Baz'
        }]
    },
    {
        id: 2,
        name: 'Abe Elias',
        phoneNumber: '666 1234',
        children: [{
          id: 21,
          name: 'Foo'
        },{
          id: 21,
          name: 'Bar'
        }]
    }
];
Run Code Online (Sandbox Code Playgroud)

有没有办法将它加载到某些模型和商店,像这样?

Ext.define('Child', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',    type: 'int'},
        {name: 'user_id',    type: 'int'},
        {name: 'name',  type: 'string'}
    ],

    belongsTo: 'User'
});

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',    type: 'int'},
        {name: 'name',  type: 'string'},
        {name: 'phone', type: 'string', mapping: 'phoneNumber'}
    ],

    hasMany: {model: 'Child', name: 'children'}
});

var store = Ext.create('Ext.data.Store', {
    autoLoad: true,
    model: 'User',
    data : data
});
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只找到了一种方法来循环遍历商店:

store.each(function(r){
  r.childrens().loadData(r.data.children);
});
Run Code Online (Sandbox Code Playgroud)

但这似乎并不好.

我只想加载一次数据.我真的不想在每个孩子中指定外键,因为我的数据已经结构化了.

有没有人做过类似的事情?有没有更好的方法来解决这个问题?

and*_*nes 5

我想我已经修好了.显然你需要在你的商店里使用一个阅读器,即使它只是一个内存,如下所示:

var store = Ext.create('Ext.data.Store', {
    autoLoad: true,
    model: 'User',
    data : data,
    proxy: {
        type: 'memory',
        reader: {
            type: 'json'
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

然后它将填充所有模型,生成其关联而无需外键.

我假设没有代理,数据以不同的方式加载,这不会填充我的模型.