2012-04-11 7 views
1

У меня есть следующие данные:Наполнение связанные модели с вложенной JSON

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' 
     }] 
    } 
]; 

Есть ли способ, чтобы загрузить его в некоторых моделях и в магазине, как это?

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

Я только нашел один способ сделать это до сих пор, обернув по магазину:

store.each(function(r){ 
    r.childrens().loadData(r.data.children); 
}); 

Но это не кажется большим.

Я только хочу загрузить данные один раз. Я действительно не хочу указывать внешний ключ в каждом дочернем элементе, так как мои данные уже структурированы.

Кто-нибудь сделал что-то подобное? Есть ли лучший способ приблизиться к этому?

ответ

5

Думаю, я исправил это. Очевидно, что вам нужно использовать читатель в вашем магазине, даже если его просто память, как здесь:

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

Тогда заполнят все модели, создавая свои ассоциации без необходимости внешних ключей.

Я предполагаю, что без прокси данные загружаются по-другому, что не заполняет мои модели.