Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用ExtJS存储访问关联模型中的数据?_Javascript_Json_Extjs_Extjs4.2 - Fatal编程技术网

Javascript 如何使用ExtJS存储访问关联模型中的数据?

Javascript 如何使用ExtJS存储访问关联模型中的数据?,javascript,json,extjs,extjs4.2,Javascript,Json,Extjs,Extjs4.2,我在一个页面中有几个组件,主要是自制的。每个都有自己的商店+模型+视图。出于性能方面的考虑,我希望向后端发出一个AJAX请求,以便一次获取所有数据,然后浏览每个数据部分,并将这些部分分配给相应组件的存储。 但我似乎看不懂这些部分。 我试着遵循这里的提示,但没有成功 后端返回的JSON数据如下所示: { "success":true, "results":8, "data":[{ "bv01":{ "success":true, "count":1,

我在一个页面中有几个组件,主要是自制的。每个都有自己的商店+模型+视图。出于性能方面的考虑,我希望向后端发出一个AJAX请求,以便一次获取所有数据,然后浏览每个数据部分,并将这些部分分配给相应组件的存储。 但我似乎看不懂这些部分。 我试着遵循这里的提示,但没有成功

后端返回的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('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中,控制台给出错误
未捕获类型错误:未定义不是函数

编辑 我已将内存代理添加到模型中(如下所示):

并修复了控制器中获取数据的函数调用:

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);
  }
}
现在控制台读取未捕获的类型错误:无法读取未定义的属性“hasId”。根据我所做的搜索,当有人试图从网络读取数据时,似乎会出现这种情况


我有点进一步,但我仍然有被卡住的感觉…

你的问题很好,但我相信它可能是重复的,在上有很多关于ExtJs关联的帖子,有时会有点痛苦。你可以打一个Ajax调用,并使用成功回调在每个商店加载数据。谢谢大家,谢谢你的快速回答。我正在探索你提供的链接,可编写脚本。不过,其中很多我已经读过了。我想我有收获了。如果我自己找到答案,我会发布一个答案。我已经用我的进度编辑了这个问题。有什么帮助吗?我遇到的所有示例要么涉及“hasMany”关联(这不是我的情况),要么涉及写/同步问题(这也不是我的情况)。
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);
  }
}