ExtJS Grid Panelに保存されたデータを、使用してロードした方法とまったく同じ方法で返すことができるメソッドはありますか?
var data = ["value1", "value2"]
Store.loadData(data);
グリッドをリロードするユーザーオプションが必要ですが、ストアへの変更を考慮する必要があります。ユーザーは変更を加えることができ、グリッドは動的に更新されますが、グリッドを再ロードすると、データベースが新しい変更で更新されていても、最初にロードされたデータが表示されます。ページをリロードせずに、新しく変更されたストアでグリッドデータ自体をリロードできるようにしたいと思います。
私はこのようなものを探していると思います:
var data = Store.getData();
//data = ["value1", "value2"]
そのすべてが言って完了した後。または、私が知らない新しいデータでグリッドを更新する別の方法があります。プロキシを使用しても、新しいストアではなく「元の」データが使用されます。
Store.getRange()
はまさにあなたが探しているもののようです。 Ext.data.Record[]
-レコードの配列。引数が渡されない場合、すべてのレコードが返されます。
1行のアプローチ:
var jsonData = Ext.encode(Ext.pluck(store.data.items、 'data'));
あまりきれいではありませんが、かなり短いです。
function getJsonOfStore(store){
var datar = new Array();
var jsonDataEncode = "";
var records = store.getRange();
for (var i = 0; i < records.length; i++) {
datar.Push(records[i].data);
}
jsonDataEncode = Ext.util.JSON.encode(datar);
return jsonDataEncode;
}
これを試して:
myStore.each( function (model) {
console.log( model.get('name') );
});
ループを作成してデータを収集/再処理する必要はありません。必要なjsonオブジェクトは次のとおりです。
var jsonData = store.proxy.reader.jsonData;
これを行う簡単な方法は
var jsonArray = store.data.items
あなたのJSONストアが
[{"text": "ABC"}, {"text": "DEF"},{"text": "GHI"},{"text": "JKL"}]
その後、次のように「DEF」を取得できます
jsonArray[1].data.text
次のコードでは、すべての文字を配列項目に変換することに気付きました。
var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));
別の簡単でクリーンな方法を次に示します。
var jsonArr = [];
grid.getStore().each( function (model) {
jsonArr.Push(model.data);
});
私は常にstore.proxy.reader.jsonData
またはstore.proxy.reader.rawData
たとえば、これは 'data'と呼ばれるルートノードにネストされたアイテムを返します。
var some_store = Ext.data.StoreManager.lookup('some_store_id');
Ext.each(some_store.proxy.reader.rawData.data, function(obj, i){
console.info(obj);
});
これは、ストアの読み取り操作の直後にのみ機能します(まだ操作されていません)。
Writer
で取得するものとまったく同じデータを取得する場合(たとえば、persist:false
configのフィールドを無視する)、次のコードを使用します(注:Ext 5.1でテストしました)
var arr = [];
this.store.each(function (record) {
arr.Push(this.store.getProxy().getWriter().getRecordData(record))
});
proxy: {
type: 'ajax',
actionMethods: {
read: 'POST',
update: 'POST'
},
api: {
read: '/bcm/rest/gcl/fetch',
update: '/bcm/rest/gcl/save'
},
paramsAsJson: true,
reader: {
rootProperty: 'data',
type: 'json'
},
writer: {
allowSingle: false,
writeAllFields: true,
type: 'json'
}
}
AllowSingleを使用して配列に変換します
より良い(IMO)1行アプローチは、ExtJS 4で動作しますが、3についてはわかりません:
store.proxy.reader.jsonData
上記で提案したように、私は以下で失敗したものを試しました。
store.proxy.reader.jsonData
しかし、以下は私のために働いた
store.proxy.reader.rawData
コンポーネントにバインドせずにストアからデータにアクセスしようとするとトラブルが発生しますが、そのほとんどはストアがajaxを介してロードされたため、データを読み取るためにloadイベントを使用する必要がありました。これはうまくいきました:
store.load();
store.on('load', function(store, records) {
for (var i = 0; i < records.length; i++) {
console.log(records[i].get('name'));
};
});
私の場合、javascriptのジャグ配列が必要でした。 [["row1Cell1"、 "row1cell2"]、["row2Cell1"、 "row2cell2"]]は、Extグリッドストアのコンテンツに基づいています。
以下のjavascriptはこのような配列を作成し、必要のないオブジェクトにidキーをドロップします。
var tableDataArray = [];
Ext.ComponentQuery.query('[name="table1"]')[0].store.each(function(record){
var thisRecordArray = [];
for (var key in record.data) {
if (key != 'id') {
thisRecordArray.Push(record.data[key]);
}
}
tableDataArray.Push(thisRecordArray);
});