【问题标题】:ExtJS 4: Understanding hasMany and belongsToExtJS 4:理解 hasMany 和 belongsTo
【发布时间】:2013-11-03 13:15:20
【问题描述】:

很长一段时间以来,我一直在努力理解如何使用 hasMany 和 belongsTo。我的理解是 hasMany 是一个 1:many 关系,belongsTo 是一个many:1 关系--aside: 那么这是否意味着如果你有一个 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 可以有很多选项卡,因为在数据中,选项卡是一个对象数组。这是 Tabs 模型:

Ext.define('Tabs', {
  extend: 'Ext.data.Model',
  fields: [
    'id',
    'name',
    'layout'
  ],
  belongsTo: [{
    name: 'tabs',
    model: 'Someconfig',
    associationKey: 'tabs'
  }]
});

现在,belongsTo 在那里,因为我在搞乱这个属性。无论如何,我无法从 Someconfig 访问 Tabs,但我可以从 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
  }
});

jsFiddledemo

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

来自Sencha forums的交叉发布。

【问题讨论】:

    标签: model extjs4 has-many extjs4.2 belongs-to


    【解决方案1】:

    您的方法存在一些问题:

    1. 当您为 一对多 关系调用 getter 时,实际上是在检索对 Store 对象 的引用,其中包含一组相关对象,因此尝试为商店检索关系标签是没有意义的。
    2. 您必须从关系存储中检索一个元素,然后通过调用 tabs方法获取其相关标签 strong> 将返回一个包含该特定实例的一组选项卡的 Store 对象。
    3. 如果您想访问到任何相关标签,您必须再次从该商店选择单个对象,以横穿整个关系树你应该这样做:
    someconfig = record.someconfig().getAt(0);
    sometab = someconfig.tabs().getAt(0);
    

    这是一个有效的modified version of your code。 希望对解决您的问题有所帮助。

    【讨论】:

    • 是的。你说得对,这些是我昨天在玩了一段时间后得出的结论。谢谢!
    • 那么有趣的是,someconfig并没有出现在record的数据中……我只能通过调用someconfig的方法来访问它。这对我来说没有意义...如果 config 模型有许多 someconfig,它应该在 config 中显示为模型数组!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2014-03-15
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多