json - एकाधिक रूट तत्वों के साथ जेसन स्टोर को लोड कैसे करें?




extjs jsonstore (2)

यदि आप 4.x का उपयोग कर रहे हैं, तो रूट पैरामीटर एक फ़ंक्शन हो सकता है:

Ext.define('MyModel', {
    extend: 'Ext.data.Model',
    fields: ['name']
});

Ext.require('*');

Ext.onReady(function(){

    var store = new Ext.data.Store({
        model: MyModel,
        proxy: {
            type: 'memory',
            reader: {
                type: 'json',
                root: function(o){
                    var out = [];
                    return out.concat(o.root1, o.root2, o.root3);
                }
            }
        },
        data: {
            root1: [{
                name: 'Item 1'
            }],
            root2: [{
                name: 'Item 2'
            }],
            root3: [{
                name: 'Item 3'
            }]
        }
    });

    store.load();
    console.log(store.getCount());
});

मेरी एक परियोजना में मुझे जेएसएनओ स्टोर को जेएसओएन सर्वर प्रतिक्रिया के साथ लोड करने की आवश्यकता है I JSON प्रतिक्रिया में मुझे 2-3 रूट तत्व प्राप्त हो रहे हैं। लेकिन स्टोर कॉन्फ़िगरेशन में मैं केवल 1 रूट तत्व प्रदान कर सकता हूं।

{
    {"level2List":[{id:'id1', name:'sample'},....]},
    {"level3List":[{id:'id1', name:'sample'},....]},
    {"level4List":[{id:'id1', name:'sample'},....]}
}

मेरी दुकान विन्यास नीचे की तरह है

store = new Ext.data.JsonStore({
// store configs
storeId: 'myStore',
proxy: {
    type: 'ajax',
    url: 'xml/getKpiInputData.json',
    reader: {
        type: 'json',
        root: 'level3List',
        idProperty: 'name'
    }
},
fields: [
        {name: 'name'},
        {name: 'id'},
       ...
    ],
remoteFilter: false,
remoteSort: true,
    pageSize: 10,
autoLoad: {start: 0, limit: 10}
 });

अगर मैं 1 रूट तत्व (पूर्व स्तर 3 लिस्ट के लिए) देता हूं तो वह संबंधित वस्तुओं को ठीक से लोड कर रहा है। लेकिन मुझे कई रूट तत्वों से डेटा लोड करने का समाधान चाहिए। कृपया स्टोर में डेटा लोड करने में मेरी सहायता करें।


मैं एक नया प्रकार Throwable , जो किसी भी प्रकार को Decodable अनुरूप लपेट सकता है:

enum Throwable<T: Decodable>: Decodable {
    case success(T)
    case failure(Error)

    init(from decoder: Decoder) throws {
        do {
            let decoded = try T(from: decoder)
            self = .success(decoded)
        } catch let error {
            self = .failure(error)
        }
    }
}

GroceryProduct की GroceryProduct (या किसी अन्य Collection ) को GroceryProduct :

let decoder = JSONDecoder()
let throwables = try decoder.decode([Throwable<GroceryProduct>].self, from: json)
let products = throwables.compactMap { $0.value }

जहां value एक गणना की गई संपत्ति को Throwable पर विस्तार में पेश किया गया है:

extension Throwable {
    var value: T? {
        switch self {
        case .failure(_):
            return nil
        case .success(let value):
            return value
        }
    }
}

मैं एक enum रैपर प्रकार (एक Struct से अधिक) का उपयोग करने का विकल्प Struct क्योंकि यह उन त्रुटियों का ट्रैक रखने के लिए उपयोगी हो सकता है जो उनके सूचकांकों के साथ-साथ फेंक दी जाती हैं।





json extjs jsonstore