ExtJS 4 के साथ गतिशील मॉडल




extjs4 (2)

मैं भी उस समस्या में चला गया। मेरे पास एक सेवा है जो सर्वर से मेटाडेटा लाने और मॉडल और स्टोर्स को इस मेटाडेटा में अनुकूलित करने के लिए ज़िम्मेदार है।

इसलिए मैंने एक खाली मॉडल परिभाषित किया और इस मॉडल का उपयोग करने के लिए स्टोर को कॉन्फ़िगर किया।

जब मेटा डेटा संसाधित होता है, तो मैं इस तरह के मॉडल के प्रोटोटाइप में नए / अतिरिक्त फ़ील्ड जोड़ता हूं (मेटाडाटास्टोर मेटा डेटा युक्त स्टोर है, मॉडल मॉडल है जो मॉडल मैनेजर से प्राप्त किया जा सकता है):

var fields = [];
metaDataStore.each(function(item) {
    fields.push(Ext.create('Ext.data.Field', {
        name: item.get('field')
    }));
});
model.prototype.fields.removeAll();
model.prototype.fields.addAll(fields);

जब मैं इस मॉडल का उपयोग कर स्टोर पर लोड कहता हूं या नए मॉडल उदाहरण बना देता हूं तो नए फ़ील्ड सही तरीके से संसाधित होते हैं।

ExtJS 3.x के साथ, मैं स्टोर की "फ़ील्ड" प्रॉपर्टी का उपयोग करने में सक्षम था, लेकिन यह एक्स्टजेस 4 के साथ लगता है मुझे बिल्कुल मॉडल का उपयोग करना है। यह ठीक है, लेकिन मेरे मामले में, यह एक स्थिर मॉडल नहीं है, और मुझे फ्लाई पर फ़ील्ड को परिभाषित करने और कभी-कभी उन्हें बदलने की आवश्यकता है।

मैं एक मॉडल फिर से बना सकता हूं, लेकिन मुझे एक अलग नाम का उपयोग करने की आवश्यकता है क्योंकि यह एक एक्सिसिटिंग मॉडल को संशोधित करना संभव नहीं है, न ही इसे हटाएं। यदि मैं एक ही नाम के साथ Ext.regModel का उपयोग करने का प्रयास करता हूं, तो ExtJS क्रैश हो जाता है।

आपकी सहायताके लिए धन्यवाद!


यहां एक बहुत ही सरल उदाहरण है। बस एक सामान्य Ext.data.Store का उपयोग करें, लेकिन मॉडल के बजाय, फ़ील्ड गुण निर्दिष्ट करें:

// you can specify a simple string ('totally')
// or an object with an Ext.data.Field ('dynamic')
var fields = ['totally', {name : 'dynamic', type : 'string'}];
var newStore = new MyApp.store.Object({
  fields : fields
  // other options like proxy, autoLoad...
});

मॉडल संपत्ति निर्दिष्ट न करें - ऐसा लगता है कि यह फ़ील्ड संपत्ति को ओवरराइड करेगा।

मैं गतिशील रूप से मौजूदा ग्रिड के कॉलम और सामग्री को भी बदलना चाहता था:

// reconfigure the grid to use the new store and other columns
var newColumns = [
  {header: 'Totally', dataIndex: 'totally'},
  {header: 'Dynamic', dataIndex: 'dynamic'}
];
myGrid.reconfigure(newStore, newColumns);

Ext.data.Store की "फ़ील्ड" संपत्ति के बारे में Ext JS 4 दस्तावेज़ से:

इसका उपयोग मॉडल कॉन्फ़िगरेशन निर्दिष्ट करने के स्थान पर किया जा सकता है। फ़ील्ड Ext.data.Field कॉन्फ़िगरेशन ऑब्जेक्ट्स का एक सेट होना चाहिए। स्टोर स्वचालित रूप से इन फ़ील्ड के साथ Ext.data.Model बना देगा। आम तौर पर इस कॉन्फ़िगरेशन विकल्प से बचा जाना चाहिए, यह पिछड़ा संगतता के प्रयोजनों के लिए मौजूद है। किसी भी अधिक जटिल के लिए, जैसे किसी विशेष आईडी प्रॉपर्टी या assocations निर्दिष्ट, एक Ext.data.Model परिभाषित किया जाना चाहिए और मॉडल कॉन्फ़िगरेशन के लिए निर्दिष्ट किया जाना चाहिए।

तो सावधान रहें - सेन्चा भविष्य में इसे हटा सकता है।