Как получить доступ к данным в связанных моделях, используя магазины 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, Судя по моим поискам, это кажется, когда я пытаюсь прочитать данные из сети.

Я становлюсь немного дальше, но у меня все еще есть чувство застревания...

0 ответов

Другие вопросы по тегам