2012-07-17 62 views
3

我試圖將XML數據映射到ExtJS中的一系列模型。我能夠從頂層模型中提取數據,但是與它的關聯無法檢索必要的數據。嵌套的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> 

控制檯吐出 「遺漏的類型錯誤:無法調用 '的indexOf' 的未定義」 爲RecordAddresses輸出,以及那麼我得到一個填充了數組對象的對象,其中包含0個對象用於關聯數據輸出。

我完全沉迷於這一個。我到處搜索過,它把我帶到了這一步。爲什麼記錄不在該XML文件中加載嵌套數據?

任何幫助將不勝感激。

+0

,你才能發佈您的工作示例 – user203687 2013-11-07 22:57:26

回答

4

爲什麼在hasMany關係中設置autoLoad = true?

您嘗試使用嵌套的數據,然後你告訴它按需加載的數據,不知道爲什麼沒有嵌套數據:)

您還缺少associationKey,這是需要嵌套加載。

這裏是你的代碼的工作示例:

http://jsfiddle.net/el_chief/668Fg/5/

按照我的「規則」在未來,一切都會好起來:

http://extjs-tutorials.blogspot.ca/2012/05/extjs-hasmany-relationships-rules.html

+0

感謝您的回覆。我喜歡「規則」部分 - 看起來我幾乎打破了他們中的每一個:D。我目前無法讚揚你,因爲我需要聲望達到15分。我會給你嘗試的鏈接,如果我取得了成功,我會將其標記爲公認的答案。 – guitarist809 2012-07-18 15:40:15

+0

哇,我不能相信什麼修復它是associationKey。謝謝一堆!一旦我能夠,我一定會對你的答案滿意。 – guitarist809 2012-07-18 15:56:52