很难理解模型的“关联”功能以及开发人员如何通过关联访问嵌套数据。
这是我们试图解析的一个简单的 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<contact>
<id>1</id>
<name>Bob Jones</name>
<emails>
<email>
<addr>bjones1@dom.com</addr>
<display>B. Jones 1</display>
</email>
<email>
<addr>bjones2@dom.com</addr>
<display>B. Jones 2</display>
</email>
</emails>
</contact>
<contact>
<id>2</id>
<name>John Rodeo</name>
<emails>
<email>
<addr>jrodeo1@dom.com</addr>
<display>J. Rodeo 1</display>
</email>
<email>
<addr>jrodeos2@dom.com</addr>
<display>J. Rodeo 2</display>
</email>
</emails>
</contact>
</contacts>
这是相关的模型
Ext.define('MyApp.model.Contact', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Emails'
],
fields: [
{
name: 'id'
},
{
name: 'name'
}
],
hasMany: {
model: 'MyApp.model.Emails',
autoLoad: true,
foreignKey: 'addr',
name: 'emailAddresses'
}
});
Ext.define('MyApp.model.Emails', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Contact'
],
idProperty: 'addr',
fields: [
{
name: 'addr'
},
{
name: 'display'
}
],
belongsTo: {
model: 'MyApp.model.Contact'
}
});
最后,这是商店:
Ext.define('MyApp.store.MyXmlStore', {
extend: 'Ext.data.Store',
requires: [
'MyApp.model.Contact'
],
constructor: function(cfg) {
var me = this;
cfg = cfg || {};
me.callParent([Ext.apply({
autoLoad: true,
storeId: 'MyXmlStore',
model: 'MyApp.model.Contact',
proxy: {
type: 'ajax',
url: 'data/data.xml',
reader: {
type: 'xml',
record: 'contact'
}
}
}, cfg)]);
}
});
我们创建了一个简单的 Grid 并将其链接到 Store ......然后,它显示了联系人(快速 ascii 渲染)
+---------------------------+
| My Grid Panel |
+-----+---------------------+
| Id | Name |
+-----+---------------------+
| 1 | Bob Jones |
| 2 | John Rodeo |
但是我们完全不知道如何检索相关的电子邮件记录。
我读过 GridPanel 可能无法正确呈现关联数据。这对我们来说没问题——我们只是想弄清楚如何使用这个模型数据以编程方式访问它。
例如,假设我们想创建一个附加到商店的简单 onXmlstoreLoad 事件,并且我们只想在加载后 console.log() 电子邮件地址——正确的语法是什么?
我们已经尝试了推荐的方法:
onXmlstoreLoad: function(store, records, successful, operation, options) {
console.log(store.emailAddresses.getAt(0));
}
但这会导致未定义的引用。
我承认这可能归结为我们错误地描述了我们的模型,但是我们已经尝试了几十种不同的配置,并且无法弄清楚问题是否是数据没有进入存储......或者我们是否可以't reference 在语法上是正确的。