ExtJS स्टोर से JSON डेटा ऐरे को कैसे पुनर्प्राप्त करें




(13)

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 का उपयोग करें यह सरणी में परिवर्तित हो जाएगा

क्या कोई तरीका है जो मुझे अपने संग्रहित डेटा को एक एक्स्टजेस ग्रिड पैनल में वापस करने की इजाजत देता है जिस तरह से मैंने इसे लोड किया है:

var data = ["value1", "value2"]
Store.loadData(data);

मैं ग्रिड को फिर से लोड करने के लिए एक उपयोगकर्ता विकल्प चाहता हूं, लेकिन स्टोर में बदलावों को ध्यान में रखना आवश्यक है। उपयोगकर्ता परिवर्तन कर सकता है और ग्रिड गतिशील रूप से अपडेट किया गया है, लेकिन अगर मैं ग्रिड को फिर से लोड करता हूं, तो मूल रूप से लोड किया गया डेटा दिखाया गया है, भले ही डेटाबेस को नए बदलावों के साथ अद्यतन किया गया हो। मैं पृष्ठ को फिर से लोड नहीं करना चाहूंगा और बस उन्हें नए बदले हुए स्टोर के साथ ग्रिड डेटा को पुनः लोड करने दें।

मुझे लगता है कि मैं इस तरह कुछ ढूंढ रहा हूं:

var data = Store.getData();
//data = ["value1", "value2"]

सब कुछ कहा और किया के बाद। या ग्रिड को नए डेटा के साथ रीफ्रेश करने का एक अलग तरीका है जिसे मैं नहीं जानता हूं। प्रॉक्सी का उपयोग करने से भी "मूल" डेटा का उपयोग होता है, न कि नई दुकान।


जैसा ऊपर बताया गया है, मैंने असफल होने के साथ नीचे की कोशिश की।

store.proxy.reader.jsonData

लेकिन नीचे एक मेरे लिए काम किया

store.proxy.reader.rawData

इसे इस्तेमाल करे:

myStore.each( function (model) {
    console.log( model.get('name') ); 
}); 

मैं किसी भी घटक को बाध्य किए बिना स्टोर से डेटा तक पहुंचने का प्रयास करने में परेशानी के अपने हिस्से में भाग लेता हूं, और इसमें से अधिकांश इसलिए था क्योंकि स्टोर को अजीब लोड किया गया था, इसलिए डेटा पढ़ने के लिए लोड इवेंट का उपयोग करना पड़ा। यह काम किया:

store.load();
store.on('load', function(store, records) {
    for (var i = 0; i < records.length; i++) {
    console.log(records[i].get('name'));
    };
});

ऐसा करने का एक आसान तरीका है

var jsonArray = store.data.items

तो अगर आपका JSON स्टोर है

[{"text": "ABC"}, {"text": "DEF"},{"text": "GHI"},{"text": "JKL"}]

फिर आप "डीईएफ" को पुनः प्राप्त कर सकते हैं

jsonArray[1].data.text

निम्नलिखित कोड में, मैंने देखा कि यह प्रत्येक चरित्र को एक सरणी आइटम में परिवर्तित करता है।

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

एक लाइन दृष्टिकोण:

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

बहुत सुंदर नहीं है, लेकिन काफी छोटा है।


मैं हमेशा store.proxy.reader.jsonData या store.proxy.reader.rawData उपयोग store.proxy.reader.jsonData store.proxy.reader.rawData

उदाहरण के लिए - यह 'डेटा' नामक रूट नोड में घिसने वाले आइटम लौटाता है:

var some_store = Ext.data.StoreManager.lookup('some_store_id');
Ext.each(some_store.proxy.reader.rawData.data, function(obj, i){
   console.info(obj);
});

यह केवल स्टोर रीड-ऑपरेशन के बाद ही काम करता है (जबकि अभी तक छेड़छाड़ नहीं किया गया है)।


यहां एक और आसान साफ ​​तरीका है:

var jsonArr = [];
grid.getStore().each( function (model) {
    jsonArr.push(model.data);
});

आपको किसी भी लूप को बनाने और डेटा को एकत्र / पुन: संसाधित करने की आवश्यकता नहीं है। आपको जिस जेसन ऑब्जेक्ट की आवश्यकता है वह यहां है:

var jsonData = store.proxy.reader.jsonData;

Store.getRange() बिल्कुल वही लगता है जो आप खोज रहे हैं। यह आपको Ext.data.Record[] - रिकॉर्ड्स की सरणी वापस कर Ext.data.Record[] । यदि कोई तर्क पारित नहीं होता है, तो सभी रिकॉर्ड वापस आते हैं।


 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;
    }

यदि आप डेटा को वही प्राप्त करना चाहते हैं जो आपको Writer द्वारा मिलता है (उदाहरण के लिए persist:false फ़ील्ड को अनदेखा करना persist:false कॉन्फ़िगरेशन), निम्न कोड का उपयोग करें (नोट: मैंने इसे EX 5.1 में परीक्षण किया है)

  var arr = [];   

    this.store.each(function (record) {
        arr.push(this.store.getProxy().getWriter().getRecordData(record))
    });  

एक और पूरा समाधान, जिसमें यह एक पकड़ होगा-यह सब है:

Ext.util.Observable.observe(Ext.data.Connection, {
    requestexception: function(conn, response, options) {
        if(response.status == '403')
            window.location = 'login';
    }
});

ऐसा इसलिए है क्योंकि अंतर्निहित वर्ग, Ext.data.Connection न केवल Ext.data.Connection में उपयोग किया जाता है, साथ ही Ext.data.Proxy जिसे Ext.data.Store, Ext.data.Model द्वारा उपयोग किया जाता है। यह store.load() और store.load() जैसी कॉलों पर अपवादों को संभालता है। यह एक अधिक पूर्ण पकड़-सभी हैंडलर होना चाहिए।

मेरे ब्लॉग पोस्ट में और विवरण देखें