モデルの「関連付け」機能と、開発者が関連付けを介してネストされたデータにアクセスする方法について頭を悩ませています。
これが、解析しようとしている単純な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)]);
}
});
単純なグリッドを作成してストアにリンクします...そしてpresto、連絡先を表示します(クイック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));
}
しかし、これは未定義の参照になります。
モデルの説明が間違っている可能性があることは認識していますが、数十の異なる構成を試しましたが、問題がデータがストアに入力されていないかどうか、またはデータがストアに入力されていないかどうかを判断できません。参照しないのは構文的に正しいです。