2009-11-27 12 views
7

複雑なjsonオブジェクト(ネストされたプロパティを持つ)をGridPanelの列モデルにバインドしようとしています。 IE:私はreport.customer_nameとreport.report_data.customer.desc テストデータ、たとえば、にグリッド列をマップする:ext js - 複雑なjsonオブジェクトへのColumnModelバインディング

> { 
>  "success": true , 
>  "total": "1", 
>  "result": 
>   { 
>    "report": { 
>     "customer_name": "cust one", 
>     "account_number": "", 
>     "report_data": { 
>      "detail": "these are details", 
>      "desc": "mydesc"       
>     } 
>    } 
>  } } 

ので、私のcolumnmodelが

var colModel = new Ext.grid.ColumnModel([ 
     {header: "Customer", sortable: true, dataIndex: 'customer_name'}, 
     {header: "Account", width: 75, sortable: true, dataIndex: 'account_number'}, 
     {header: "Detail", width: 75, sortable: true, dataIndex:'HOW DO I DO THIS'} 
    ]); 

ようなものになるだろう、私は詳細列のdataIndexを 'report_data.details'として試しましたが、機能しませんでした。

これを行うことができるかどうか誰かから教えてもらえますか? または、私はそれを読む前にオブジェクトを「平坦化」する必要がありますか? ありがとう!

答えて

10

あなたはレコード記述でネストされたオブジェクトの値のプロパティへのマッピングを確立することができますJsonReaderまたはJsonStoreを使用している場合:

new Ext.data.JsonReader({ 
    root: 'result', 
    totalProperty: 'total', 
    fields: [ 
     {name: 'customer_name'}, 
     {name: 'account_number'}, 
     {name: 'detail', mapping: 'report_data.detail'} 
    ] 
}); 

あなたの列モデルが、その後のための「詳細」のdataIndexを参照しますその列。

サーバーが送信するデータは、例に含まれているデータとは多少異なるはずです。上記の読者は、フォームのデータオブジェクトを消費することになる:あなたの助けを

{ 
    "success": true, 
    "total": 1, 
    "result": [ 
     { 
      "customer_name": "cust one", 
      "account_number": "", 
      "report_data": { 
       "detail": "these are details", 
       "desc": "mydesc" 
      } 
     } 
    ] 
} 
+0

完璧なおかげでたくさん:) – 29er

+0

をサーバーがnull report_dataを持っている場合は何?それは店を制動するように見えます。何か案が ? – jujule

+0

あなたはレンダラのトリックでそれを "ハック" することができ@jujule: '' 'JavaScriptの 関数get_report_data(report_data){ 場合(!report_data = NULL){ 戻りreport_data.detail。 }リターン "" } '' 、次いでグリッドで: 'ジャバスクリプト {テキスト: "詳細"、レンダラ:get_report_data、dataIndex: 'report_data'} ' 質問は:これは正しい方法ですか? –

関連する問題