如何访问Extjs嵌套模型(从Xml加载)?
很难理解模型的“关联”特性以及如何 开发人员可以通过关联访问嵌套数据 下面是一个简单的XML文件,我们正试图解析它如何访问Extjs嵌套模型(从Xml加载)?,xml,model,extjs4,Xml,Model,Extjs4,很难理解模型的“关联”特性以及如何 开发人员可以通过关联访问嵌套数据 下面是一个简单的XML文件,我们正试图解析它 <?xml version="1.0" encoding="UTF-8"?> <contacts> <contact> <id>1</id> <name>Bob Jones</name> <emails> &
<?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.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)]);
}
});
我们创建了一个简单的网格并将其链接到商店…和presto,
它显示联系人(快速ascii呈现)
但是我们完全不知道如何检索相关的电子邮件
记录
我读到GridPanel可能无法正确渲染关联的
数据。这对我们来说没问题,我们只是想开动脑筋
我们如何使用该模型数据以编程方式访问它
例如,假设我们想要创建一个简单的onXmlstoreLoad事件
加载后,我们只需要console.log()来记录电子邮件地址
--正确的语法是什么
我们尝试了推荐的方法:
onXmlstoreLoad: function(store, records, successful, operation, options) {
console.log(store.emailAddresses.getAt(0));
}
但这会导致一个未定义的引用
我承认这可能归结为我们对模型的描述不正确,但我们已经尝试过了
几十种不同的配置,无法确定问题是否存在
是数据没有进入商店…还是我们不能参考
语法正确。最终找到了我所缺少的东西,以便能够正确地读取嵌套模型。一旦我们正确地填充了我们的存储,访问嵌套数据记录就很简单了 我们缺少的关键部分是代理/读取器。每个模型都需要有自己的代理读取器,以便您可以指定“记录”和“根”参数 我建议任何一个偶然发现这个帖子的人去看看Neil McGuigan维护的优秀网站--。这里有很多重要的提示和最佳实践,你应该遵循 Neil为我们的解决方案提供的一条重要线索是,开发人员应该将代理和阅读器挂在模型之外,而不是商店之外。这使得管理特定于Xml的记录/根参数变得简单 当这是一个艰难的一个…对于任何人谁第一次进入了Extjs的深层次,我强烈建议你与Firebug近距离接触。进入extjs源代码,我们开始回答许多重要的问题,这些问题涉及到各种比特和片段是如何组合在一起的 extjs代码库的文档非常丰富。尽管开发人员显然是Javascript中的黑带,这有时会让他们面临挑战,但最终的结果是值得付出努力的 如果您正在寻找工作代码 我们的商店
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',
listeners: {
load: {
fn: me.onXmlstoreLoad,
scope: me
}
}
}, cfg)]);
},
onXmlstoreLoad: function(store, records, successful, operation, options) {
console.log("onXmlstoreLoad:"+ successful);
console.log(s.getAt(0).emailAddressesStore.getAt(0));
}
});
还有我们的模型
Ext.define('MyApp.model.Contact', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Emails'
],
fields: [
{
mapping: 'id',
name: 'id',
type: 'int'
},
{
mapping: 'name',
name: 'name',
type: 'string'
}
],
hasMany: {
associationKey: 'emails',
model: 'MyApp.model.Emails',
name: 'emailAddresses'
},
proxy: {
type: 'ajax',
url: 'data/data.xml',
reader: {
type: 'xml',
root: 'contacts',
record: 'contact'
}
}
});
Ext.define('MyApp.model.Emails', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Contact'
],
fields: [
{
mapping: 'addr',
name: 'addr',
type: 'string'
},
{
mapping: 'display',
name: 'display',
type: 'string'
}
],
proxy: {
type: 'ajax',
url: 'data/data.xml',
reader: {
type: 'xml',
root: 'emails',
record: 'email'
}
},
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',
listeners: {
load: {
fn: me.onXmlstoreLoad,
scope: me
}
}
}, cfg)]);
},
onXmlstoreLoad: function(store, records, successful, operation, options) {
console.log("onXmlstoreLoad:"+ successful);
console.log(s.getAt(0).emailAddressesStore.getAt(0));
}
});
Ext.define('MyApp.model.Contact', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Emails'
],
fields: [
{
mapping: 'id',
name: 'id',
type: 'int'
},
{
mapping: 'name',
name: 'name',
type: 'string'
}
],
hasMany: {
associationKey: 'emails',
model: 'MyApp.model.Emails',
name: 'emailAddresses'
},
proxy: {
type: 'ajax',
url: 'data/data.xml',
reader: {
type: 'xml',
root: 'contacts',
record: 'contact'
}
}
});
Ext.define('MyApp.model.Emails', {
extend: 'Ext.data.Model',
uses: [
'MyApp.model.Contact'
],
fields: [
{
mapping: 'addr',
name: 'addr',
type: 'string'
},
{
mapping: 'display',
name: 'display',
type: 'string'
}
],
proxy: {
type: 'ajax',
url: 'data/data.xml',
reader: {
type: 'xml',
root: 'emails',
record: 'email'
}
},
belongsTo: {
model: 'MyApp.model.Contact'
}
});