Model ExtJS 4:理解有很多方面

Model ExtJS 4:理解有很多方面,model,extjs4,has-many,extjs4.2,belongs-to,Model,Extjs4,Has Many,Extjs4.2,Belongs To,一段时间以来,我一直在努力理解如何使用hasMany和belongsTo。我的理解是hasMany是一个1:many关系,belongsTo是一个多:1关系--旁白:这是否意味着如果你有一个hasMany关系,那么在它的子模型中需要一个belongsTo?我读过几篇关于它的文章: 正在页面上加载嵌套数据 不过还是有点困惑。假设我有以下数据: var data = { "config": { "name": "blah", "id": 1, "some

一段时间以来,我一直在努力理解如何使用hasMany和belongsTo。我的理解是hasMany是一个1:many关系,belongsTo是一个多:1关系--旁白:这是否意味着如果你有一个hasMany关系,那么在它的子模型中需要一个belongsTo?我读过几篇关于它的文章:

  • 正在页面上加载嵌套数据
不过还是有点困惑。假设我有以下数据:

var data = {
  "config": {
    "name": "blah",
    "id": 1,
    "someconfig": [{
        "name": "Services", "tabs": [{
            "id": 0, "name": "Details", "layout": "hbox"
          }, {
            "id": 1, "name": "Sources", "layout": "hbox"
          }, {
            "id": 2, "name": "Paths", "layout": "hbox"
          }, {
            "id": 3, "name": "Ports", "layout": "hbox"
          }, {
            "id": 4, "name": "Levels", "layout": "hbox"
          }, {
            "id": 5, "name": "Notes", "layout": "hbox"
          }]
      }, {
        "name": "Services2", "tabs": [{}]
      }]
  }
};
我将为配置创建一个模型:

Ext.define('Config', {
  extend: 'Ext.data.Model',
  fields: ['name'],
  hasMany: [{
    name: 'someconfig',
    model: 'Someconfig',
    associationKey: 'someconfig'
  }],
  proxy: {
    type: 'memory',
    data: data,
    reader: {
      type: 'json',
      root: 'config'
    }
  }
});
所以Config可以有很多someconfig,因为在数据中,someconfig是一个对象数组。以下是Someconfig模型:

Ext.define('Someconfig', {
  extend: 'Ext.data.Model',
  fields: [
    'name'
  ],
  hasMany: [{
    name: 'tabs',
    model: 'Tabs',
    associationKey: 'tabs'
  }]
});
好的,一模一样。Someconfig可以有许多选项卡,因为在数据中,选项卡是一个对象数组。以下是选项卡模型:

Ext.define('Tabs', {
  extend: 'Ext.data.Model',
  fields: [
    'id',
    'name',
    'layout'
  ],
  belongsTo: [{
    name: 'tabs',
    model: 'Someconfig',
    associationKey: 'tabs'
  }]
});
现在,贝朗斯托在那里,因为我在这里乱搞。无论如何,我不能从Someconfig访问选项卡,但我可以从Config访问Someconfig。请看下面的代码:

Config.load(1, {
  success: function(record, operation) {
    console.log(record.get('name'));  // works
    console.log(record.someconfig().getCount());  // works, gives me 2
    console.log(record.someconfig().data.items[0].data);  // only prints out name and config_id
//      console.log(record.someconfig().tabs());  // doesn't exist
  }
});
jsFiddle

我想知道的是,我是否应该能够从someconfig()访问tabs(),或者我是否误解了这些关系?如果是前者,我将如何修复代码


交叉发布自。

您的方法有一些问题:

  • 当您为一对多关系调用getter时,实际上是在检索对包含一组相关对象的存储对象的引用,因此尝试检索存储的关系选项卡是没有意义的
  • 您必须从关系存储中检索一个元素,然后通过调用tabs方法获取其相关选项卡,该方法将返回包含该特定实例的一组选项卡的存储对象
  • 如果您希望访问任何相关选项卡,您必须再次从该存储中选择单个对象,要横穿整个关系树,您应该执行以下操作:
  • 这是一个有效的方法。
    希望它能帮助你解决问题。

    是的。你说得很对,这就是我昨天在反复研究之后得出的结论。谢谢因此,有趣的是,
    someconfig
    没有显示在
    record
    的数据中。。。我只能通过调用其方法访问
    someconfig
    。这对我来说没有意义。。。如果
    config
    模型有许多
    someconfig
    ,它应该作为一个模型数组显示在
    config
    中!
    someconfig = record.someconfig().getAt(0);
    sometab = someconfig.tabs().getAt(0);