2011-04-22 18 views
28

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

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

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

उत्तर

20

4.1 अद्यतन:

एक अद्यतन के रूप में ... 4.1 में वहाँ अब एक स्थिर विधि setFields जो मॉडल प्रोटोटाइप क्षेत्रों को परिभाषित करने के लिए किया जा सकता है। यह एक नियंत्रक की init विधि में अच्छी तरह से काम करता है।

जब मैंने ऐसा किया, तो मैं मॉडल वर्ग में परिभाषित कुछ स्थैतिक फ़ील्ड रखना चाहता था और फिर कुछ और गतिशील रूप से सेट करना चाहता था। दुर्भाग्यवश नया setFields विधि तर्क के साथ सभी फ़ील्ड को प्रतिस्थापित करता है, हालांकि इसे संभालने में काफी आसान था।

यह उदाहरण MVC पैटर्न जहाँ मेरे मॉडल और दुकान में शामिल किए गए हैं का उपयोग करता है नियंत्रक के model सरणी और store सरणी (मुझे काम से नीचे का इस्तेमाल किया ही टिककर खेल के साथ प्रदान):

Ext.define('ST.controller.Main', { 
    extend: 'Ext.app.Controller', 

    models: ['User', 'Reference'], 

    stores: ['CurrentUser', 'PermissionRef'], 

    views: ['MainPanel'], 

    init: function() { 
     var me = this; 

     me.getPermissionRefStore().on('load', function(store, records) { 
      var model = me.getUserModel(); 
       // this returns the static fields already defined 
       // in my User model class 
       fields = model.prototype.fields.getRange(); 

      // add the permission options (dynamic fields) to the static fields 
      Ext.each(records, function(permission) { 
       fields.push({name: permission.get('name'), type: 'bool'}); 
      }); 

      // 4.1 method to update the User model fields 
      model.setFields(fields); 

      // now load the current user (it will use the updated model) 
      me.getCurrentUserStore().load(); 

     }); 

    } 

}); 

User मॉडल और CurrentUser दुकान कर रहे हैं नियमित रूप से, गैर गतिशील मॉडल और दुकानों की तरह बनाया गया है और उनके संबंधित नियंत्रक सरणी में शामिल किया जाएगा, 'उपयोगकर्ता' मॉडल बस ऊपर दिखाए गए गतिशील फ़ील्ड को याद कर रहा है।

+0

अद्यतन – Jom

+0

अपडेट जोड़ने के लिए धन्यवाद आप नए फ़ील्ड सीधे 'फ़ील्ड्स' मिश्रित कोलेक्शन' में क्यों नहीं जोड़ते? क्या 'सेटफिल्ड्स' विधि द्वारा कोई आवश्यक प्रसंस्करण किया गया है? मेरा मतलब है कि आपके मामले में 'फ़ील्ड 'उदाहरण बनाने के बगल में। – rixo

3

यहां एक बहुत ही सरल उदाहरण है। सिर्फ एक सामान्य 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... 
}); 

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

यह हो सकता है: Ext.data.Store की "फील्ड" संपत्ति के बारे में

// 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 जे एस 4 प्रलेखन से:

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

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

+0

यहां पर सावधान रहें - यदि आप मॉडल को अनदेखा करते समय फ़ील्ड पर फ़ील्ड सेट करते हैं, और आपके पास कस्टम आईडी फ़ील्ड है, तो आप असफल हो जाएंगे। आपके स्टोर रिकॉर्ड में उनका आईडी सेट होगा, लेकिन आईडीआईडी ​​() के माध्यम से आईडी वापस नहीं कर पाएंगे क्योंकि वे कस्टम आईडी के बारे में नहीं जानते। यह सुनिश्चित नहीं है कि यह एक बग है, लेकिन मैंने इसे अभी भी रिपोर्ट किया है http://www.sencha.com/forum/showthread.php?280160-model.getId()-with-custom-IdProperty-fails-when-and-store -फील्ड-सेट-थ्रू-मेटाडेटा और पी = 102428 9 और व्यूफुल = 1 # पोस्ट 1024289 – HDave

+0

यह वह है जो मेरे लिए काम करता है ... "मॉडल" से दूर रहना था, और इसके बजाय इसे कट्टर कॉन्फ़िगर करना .. – PedroMorgan

17

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

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

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

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

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

संबंधित मुद्दे