我正在尝试将XML数据映射到ExtJS中的一系列模型。我能够从顶层模型中提取数据,但是与它的关联无法检索必要的数据。
以下是我的所有模特:
Ext.define('app.model.ProductType', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [{
name: 'id',
mapping: 'id',
type: 'int'
}, {
name: 'name',
mapping: 'name',
type: 'string'
}, {
name: 'sometag',
mapping: 'sometag',
type: 'string'
}],
associations: [{
type: 'hasMany',
model: 'app.model.Address',
name: 'addresses',
autoLoad: true,
reader: {
type: 'xml',
record: 'address',
root: 'addressList'
}
}, {
type: 'hasMany',
model: 'app.model.PhoneContact',
name: 'contacts',
autoLoad: true,
reader: {
type: 'xml',
record: 'phoneContact',
root: 'phoneContactList'
}
}, {
type: 'hasOne',
model: 'app.model.OneToOne',
name: 'oneToOne',
autoLoad: true,
reader: {
type: 'xml',
record: 'oneToOne'
}
}],
proxy: {
type: 'ajax',
url: 'data/example.xml',
reader: {
type: 'xml',
record: 'ProductType',
root: 'ProductResultSet'
}
}
});
地址:
Ext.define('app.model.Address', {
extend: 'Ext.data.Model',
fields: [{
name: 'city',
mapping: 'city',
type: 'string'
}, {
name: 'street',
mapping: 'street',
type: 'string'
}],
associations: [{
type: 'belongsTo',
model: 'app.model.ProductType'
}]
});
PhoneContact:
Ext.define('app.model.PhoneContact', {
extend: 'Ext.data.Model',
fields: [{
name: 'primary',
mapping: 'primary',
type: 'string'
}, {
name: 'cell',
mapping: 'cell',
type: 'string'
}],
associations: [{
type: 'belongsTo',
model: 'app.model.ProductType'
}]
});
OneToOne:
Ext.define('app.model.OneToOne', {
extend: 'Ext.data.Model',
fields: [{
name: 'first',
mapping: 'firstfield',
type: 'string'
}, {
name: 'second',
mapping: 'secondfield',
type: 'string'
}],
associations: [{
type: 'belongsTo',
model: 'app.model.ProductType'
}]
});
这是我的app.js
Ext.Loader.setConfig({
enabled: true
});
Ext.application({
name: 'app',
autoCreateViewport: false,
requires: ['app.model.ProductType', 'app.model.Address', 'app.model.PhoneContact', 'app.model.OneToOne', 'app.store.ProductTypeStore'],
launch: function () {
app.model.ProductType.load(55, {
scope: this,
callback: function (record, operation) {
console.log('Record Addresses:');
console.log(record.addresses());
}
});
var s = app.store.ProductTypeStore.create();
s.on('load', this.wiggidy, this);
s.load();
},
wiggidy: function (store, records, success, eOpts) {
var rec = store.getAt(0);
console.log('Associated Data:');
console.log(rec.getAssociatedData());
}
});
最后,example.xml
<ProductResultSet>
<ProductType>
<id>55</id>
<name>Product Name</name>
<sometag>asdf</sometag>
<addressList>
<address>
<street>12345 a</street>
<city>myCity</city>
</address>
<address>
<street>234567 b</street>
<city>Denver</city>
</address>
</addressList>
<phoneContactList>
<phoneContact>
<primary>234</primary>
<cell>4667</cell>
</phoneContact>
<phoneContact>
<primary>5467</primary>
<cell>87904</cell>
</phoneContact>
</phoneContactList>
<oneToOne>
<firstField>value</firstField>
<secondField>value</secondField>
</oneToOne>
</ProductType>
</ProductResultSet>
控制台为RecordAddresses输出吐出“Uncaught TypeError:无法调用方法'indexOf'的undefined”,然后我得到一个对象,其中填充了带有0个对象的数据,用于关联数据输出。
我对这个完全感到难过。我到处搜寻,这让我感到很茫然。为什么记录没有在该xml文件中加载嵌套数据?
非常感谢任何帮助。
答案 0 :(得分:4)
为什么要在hasMany关系中设置autoLoad = true?
您正在尝试使用嵌套数据,然后您告诉它按需加载数据,并想知道为什么没有嵌套数据:)
你也错过了associationKey,这是嵌套加载所必需的。
以下是您的代码的工作示例:
http://jsfiddle.net/el_chief/668Fg/5/
遵循我的&#34;规则&#34;在未来,一切都会好的:
http://extjs-tutorials.blogspot.ca/2012/05/extjs-hasmany-relationships-rules.html