很长时间以来,我一直在努力了解如何使用hasMany和belongsTo。我的理解是hasMany是1:1的关系,belongsTo是many:1的关系-顺便说一句:这是否意味着如果您具有hasMany关系,则在其子模型中需要belongsTo吗?我已经阅读了几篇文章:
在Ext.data.reader.Reader页面上加载嵌套数据。
Ext.data.association.BelongsTo
Ext.data.association.HasMany
Association Sample in extjs 4.2:
ExtJS Tutorials - HasMany article
ExtJS Tutorials - BelongsTo article
hasMany vs belongsTo
ExtJS 4: Models with Associations and Stores
不过还是有些困惑。假设我有以下数据:
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可以具有许多Someconfigs,因为在数据中,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访问选项卡,但可以从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:demo
我想知道的是,我是否应该能够从someconfig()访问tabs(),还是我误解了这些关系?如果是前者,我该如何修复我的代码?
从Sencha forums交叉发布。
最佳答案
您的方法在这里有一些问题:
当您为一对多关系调用getter时,实际上是在检索对包含一组相关对象的Store对象的引用,因此尝试检索商店的关系选项卡没有任何意义。
您必须从关系存储中检索一个元素,然后通过调用tabs方法来获取其相关的选项卡,该方法将返回一个包含该特定实例的一组选项卡的存储对象。
如果要访问任何相关选项卡,则必须再次从该商店中选择一个对象,以横穿整个关系树,您应该执行以下操作:
someconfig = record.someconfig().getAt(0);
sometab = someconfig.tabs().getAt(0);
这是一个有效的modified version of your code。
希望它有助于解决您的问题。