2017-02-21 4 views
1

value (maxValue)のようなモデル内に計算フィールドを入れようとしています。maxValueは、現在ロードされている他のすべてのレコードの最大値です(グリッドの現在のページと考える)。ExtJS6のModelのconvertメソッドから他のStoreレコードにアクセスする方法は?

モデル:

Ext.define('MyApp.model.Example', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id'}, 
     {name: 'value'}, 
     {name: 'calculated_value', convert: function(value, record){ 
      //how to access all the records here, not just the current one? 
     }} 
    ] 
}); 

答えて

6

モデルは、レコードを認識していないが、それだけで単一のレコードを表し、および変換の方法は、あなたが値を変換、または1つの値に他のフィールドを組み合わせることができるようにすることを意図しています(このインスタンスの他のフィールドを参照するために "depends"を定義しない限り、データがロードされたときのみ変換が呼び出され、依存するフィールドが変更されている場合は変換されません)。

グリッドを作成すると、グリッドはストアを使用し、ストアにはレコードのコレクションが格納されます。これがこれを行う場所になります。

あなたの店の設定では、 'datachanged'のリスナーを追加することができます。このリスナーは、レコードがストアに追加または削除されるたびに発生します。ここからストア内のすべてのレコードを処理し、最大値それを使ってレコードを更新します。

Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json' 
     } 
    }, 
    listeners:{ 
     datachanged:function(store){ 
      var maxValue=store.max('value'); 
      store.beginUpdate(); 
      store.each(function(record){ 
       record.set('calculated_value',maxValue); 
      }); 
      store.endUpdate(); 
     } 
    } 
}); 

サーバーからのストアをロードする場合は、その後、あなたがリーダーを実装され、これはおそらくこれを行うにはより良い場所でしょう。

Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json', 
      transform: { 
       fn: function(data) { 
        var maxValue=0; 
        Ext.each(data.items,function(item){ 
         if(item.value>maxValue) maxValue=item.value; 
        }); 
        Ext.each(data.items,function(item){ 
         item.calculated_value=maxValue; 
        }); 
        return data; 
       }, 
       scope: this 
      } 
     } 
    }, 
}); 

そのあなたが本当にこの値を複製する必要がある場合は代わりにあなただけの店で一度値を設定することができ、私はあなたを推測おそらくレンダラでは、グリッド内何とか参照したい、明確にも価値がある:

{ 
    dataIndex:'value', 
    renderer:function(value, metaData, record, rowIndex, colIndex, store, view){ 
     return Math.round((100/store.maxValue)*value)+'%'; 
    } 
} 
:あなたのグリッド列の設定、追加/更新レンダラ(この例では、私はmaxValueのの割合として値を表示)内のその後
Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json' 
     } 
    }, 
    listeners:{ 
     datachanged:function(store){ 
      store.maxValue=store.max('value'); 
     } 
    } 
}); 

関連する問題