Как получить доступ к данным в связанных моделях, используя магазины ExtJS?
У меня есть несколько компонентов, в основном домашнего изготовления, на странице. У каждого свой магазин + модель + вид. Из соображений производительности я хочу сделать один AJAX-запрос к бэкэнду, чтобы получить все данные сразу, а затем перемещаться по каждой части данных и назначать эти части хранилищам соответствующих компонентов. Но, похоже, я не могу получить / прочитать эти части. Я пытался следовать советам, найденным здесь Extjs4: Как делиться данными между несколькими магазинами или моделями? но безуспешно
Данные JSON, возвращаемые бэкэндом, выглядят так:
{
"success":true,
"results":8,
"data":[{
"bv01":{
"success":true,
"count":1,
"data":[{
"active_learner_count":0,
"connected_learner_count":0,
"enrolled_learner_count":123999,
"registered_learner_count":120098
}]
}
},{
"bv02":{
"success":true,
"count":1,
"data":[{
// Blabla
}]
}
},{
// 6 other embedded responses
}]
}
Вот фрагмент магазинов / моделей, которые я использую:
Самая внутренняя модель, содержащая данные, связанные с шаблоном (здесь не показано):
Ext.define('Ckls.module.Graphs.Square.model.Learner', {
extend: 'Ext.data.Model',
fields: [
{name: 'hugeRectCount', type: 'int', mapping: 'registered_learner_count'},
{name: 'bigRectCount', type: 'int', mapping: 'enrolled_learner_count'},
{name: 'mediumRectCount', type: 'int', mapping: 'active_learner_count'},
{name: 'smallRectCount', type: 'int', mapping: 'connected_learner_count'}
]
});
Составленная модель:
Ext.define('Reporting.Reporting.model.Kpi.Bv01', {
extend: 'Ext.data.Model',
fields:[{
name: "success",
type: "auto"
},{
name: "count",
type: "auto"
}],
hasMany: {
model: 'Ckls.module.Graphs.Square.model.Learner',
name: 'data'
},
belongsTo: 'Reporting.Reporting.model.Block'
});
Модель одного звонка:
Ext.define('Reporting.Reporting.model.Block', {
extend: 'Ext.data.Model',
hasOne: [{
model: 'Reporting.Reporting.model.Kpi.Bv01',
name : "bv01"
},{
model: 'Reporting.Reporting.model.Kpi.Bv02',
name : "bv02"
},{
... // several extra models inclusions come here
}]
});
Определение хранилища для инициализации одним вызовом:
Ext.define('Reporting.Reporting.store.Blocks', {
extend: 'Ext.data.Store',
model: 'Reporting.Reporting.model.Block',
proxy: {
type : 'ajax',
reader: {
type: 'json',
root: 'data'
},
url: '/some_url.php?some_parameter=some_value'
}
});
Контроллер:
Ext.define('Reporting.Reporting.controller.Reporting', {
extend: 'Ext.app.Controller',
init: function() {
// 'activities' is my main view
this.control({
'activities': {
afterrender: this.initAllStores
});
},
initAllStores: function() {
var blockStore = Ext.create('Reporting.Reporting.store.Blocks');
var blockStoreListeners = blockStore.on('load', this.blockStoreLoaded, this);
blockStore.load();
},
blockStoreLoaded: function(store, records, successful, eOpts) {
// As far as I can tell from the documentation, this should
// return the data as read in the sub-model but it throws an
// "undefined" error
var bv01results = store.data.getBbv01();
Ext.log({msg:"bv01results", dump: bv01results});
var bv01store = someFunctionToGetThatBv01Store();
bv01store.loadRawData(bv01results);
}
}
Я не знаю, как получить доступ к внутренним данным, а затем загрузить их в хранилище bv01. В Chrome консоль выдает ошибку Uncaught TypeError: undefined is not a function
редактировать
Я добавил в модель прокси памяти (как предложено здесь /questions/28379867/assotsiatsiya-modelej-extjs/28379872#28379872):
Ext.define('Reporting.Reporting.model.Kpi.Bv01', {
// ....
proxy: {
type: 'memory',
reader: {
type: 'json'
}
}
}
И исправил вызов функции в контроллере для получения данных:
Ext.define('Reporting.Reporting.controller.Reporting', {
// ....
blockStoreLoaded: function(store, records, successful, eOpts) {
var record0 = store.getAt(0);
Ext.log({msg:"record0", dump: record0});
// It seems that it's now trying to load the "bv01" from the
// network instead of just reading it from the record
var bv01results = record0.getBv01();
Ext.log({msg:"bv01results", dump: bv01results});
var bv01store = someFunctionToGetThatBv01Store();
bv01store.loadRawData(bv01results);
}
}
Теперь консоль читает Uncaught TypeError: Cannot read property 'hasId' of undefined
, Судя по моим поискам, это кажется, когда я пытаюсь прочитать данные из сети.
Я становлюсь немного дальше, но у меня все еще есть чувство застревания...