0

このトピックは Web 上で何度か議論されてきましたが、すべての主題が私の問題を解決するのに役立ちませんでした。私の JavaScript コードは、ネストされた JSON データを受け取ります。すべての JSON データ レベル 1 データはグリッド パネルに転記されますが、子データはすべて転記されません。私は非常に多くの方法を試しましたが、不可能です。だからこそ、私を助けてくださいとお願いしています。

私のJSON:

{
  "success":true,
  "error":false,
  "redirectUrl":null,
  "fund":[{
    "cat_id":1,
    "catname":"Europe OE Japan Large-Cap Equity",
    "region":{
      "region_id":2,
      "region_name":"JAPAN"
    }
    },{
    "cat_id":2,
    "catname":"Europe OE Europe Large-Cap Growth Equity",
    "region":{
      "region_id":1,
      "region_name":"EUROPE"
    }
   }]
} 

私のモデル:

var Recommended = new function() {

this.DataModel = function() {

Ext.define('Fund', {

    extend: 'Ext.data.Model',

    fields: [{
    name: 'catname',     
    type: 'string'
    },{
    name: 'cat_id',     
    type: 'int'     
    }],
    proxy :{
    type: 'rest',
    url: application +'directory/function',
    reader: {
        type: 'json',
        root: 'fund'

    }
    },
    associations: [{
    type: 'hasOne', 
    model: 'Region',
    primaryKey: 'region_id',
    name:'region'
    }]

});     

Ext.define('Region', {
    extend: 'Ext.data.Model',
    fields: [{
    name: 'region_name',       
    type: 'string'
    },{
    name: 'region_id',       
    type: 'int'     
    }]


});  

}

マイ ストア & グリッド パネル:

    this.JSONstore = function() {

var storeRecommended;


storeRecommended = Ext.create('Ext.data.Store', {
    model: 'Fund',
    autoLoad:true,
    groupField: 'region_name'
});     




var colModel =
[
{
    text: 'REGION', 
    width: 200,
    dataIndex: 'region_name',
    name:'region_name',
    mapping:'region.region_name'

},{
    text: 'MORNINGSTAR', 
    width: 300,
    dataIndex: 'catname',
    name:'catname'  
}       


];

var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{
    groupHeaderTpl: 'Classe: {name} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})',
    hideGroupedHeader: false
});


var grid = Ext.create('Ext.grid.Panel', {
    renderTo: 'recommendedlists',
    collapsible: true,
    iconCls: 'icon-grid',
    frame: true,
    store: storeRecommended,
    width: 1200,
    height: 400,
    title: 'Test',
    resizable: true,
    features: [groupingFeature],
    columns: colModel,
    fbar  : ['->', {
    text:'Clear Grouping',
    iconCls: 'icon-clear-group',
    handler : function(){
        groupingFeature.disable();
    }
    }]
  });
   }

   this.initControlsOnload = function() {
   Recommended.DataModel();
   Recommended.JSONstore();
   }    
} // close Recommended function
4

1 に答える 1

6

問題は、グリッドにバインドされたストアがリージョンについて何も知らないことです。資金を保管します。したがって、ストアにないデータ プロパティにマップする列を要求することはできません。ストアは Fund レコードのフラット リストです。確かに、個々のファンド自体はそれが属するリージョンを知っているかもしれませんが、ファンドのリストを含むストアは知りません。

何をすべきか?

必要なのは、クライアント側でデータ構造をフラット化することです。なんで?グリッドがフラットだからです。ファンドごとに複数のリージョンがある場合は、別のソリューションについて話します。

どうやってするか?

このアプリのサーバー側を制御し、Regionフィールドを Fund オブジェクトに追加すると、データ セットはシンプルでわかりやすく、さらに重要なことにフラットになります。サーバー側を変更できない (または変更したくない) 場合は、クライアント側のモデルマッピングを変更できます。基本的に、ファンド モデルを次のように変更します。

Ext.define('Fund', {
    extend: 'Ext.data.Model',
    fields: [
      { name: 'catname',     type: 'string' },     
      { name: 'cat_id',      type: 'int' },
      { name: 'region_name', type: 'string',
          mapping: 'region.region_name'},
      { name: 'region_id',   type: 'int',
          mapping: 'region.region_id'}     
    ]
    ....
});  

私たちがそこで何をしたか分かりますか?Region データを Fund レコードにフラット化しました。これで、あなたのストアは、地域名データに名前でアクセスすることに何の問題もありません。

幸運を、

ドミトリー。

于 2012-07-20T00:08:53.837 に答える