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'
}]
});
電話連絡先:
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出力に対して「UncaughtTypeError:Undefinedのメソッド'indexOf'を呼び出せません」を吐き出し、次に、AssociatedData出力に対して0オブジェクトの配列で満たされたオブジェクトを取得します。
私はこれに完全に困惑しています。私はいたるところを検索しました、そしてそれは私をここまで連れて行きました。レコードがそのxmlファイルにネストされたデータをロードしないのはなぜですか?
どんな助けでも大歓迎です。