2011-11-28 9 views
14

मुझे एक्स्टजेस 4 में एमवीसी पैटर्न के साथ एक समस्या आई है। कम से कम, मुझे लगता है कि मेरे पास है। इस सवाल के साथ कई लोगों से संपर्क करने और सेन्का मंचों में कई बार पोस्ट करने के बाद, अब मैं एक हल्का बल्ब या पुष्टि प्राप्त करने की उम्मीद में व्यापक दर्शकों की ओर रुख कर रहा हूं।एक्सटीजेएस 4 एमवीसी दृश्यों और उप/बाल नियंत्रक कठिनाइयों के कई उदाहरण

समस्या

आपका आवेदन कई अलग अलग विचारों, जिनमें से कुछ के लिए खुद को मिनी अनुप्रयोग हैं खोलने के लिए की क्षमता है। इसके अतिरिक्त, उपयोगकर्ता एक दृश्य के एकाधिक समवर्ती प्रतियां खोलना चाहता है।

यह एप्लिकेशन एक एकल-पृष्ठ क्लाइंट-साइड जावास्क्रिप्ट एप्लिकेशन है।

एक्सटीजेएस 4 एमवीसी मॉडल आपको उम्मीद करता है कि आप अपने आवेदन वर्ग में अपने सभी नियंत्रकों को परिभाषित करें। एप्लिकेशन को लोड होने पर इन नियंत्रकों को तब प्रारंभ किया जाता है। नियंत्रक विचारों, मॉडल और दुकानों का ट्रैक रखते हैं।

जब आप नियंत्रक को कई बार प्रारंभ करते हैं, तो एक से अधिक प्रतिलिपि बनाने के लिए कहें, आप दो दृश्यों के साथ समाप्त होते हैं जो समान डेटा स्टोर का संदर्भ देते हैं, और कार्यात्मक रूप से एप्लिकेशन ईवेंट बस में डुप्लिकेट ईवेंट भेजते हैं।

मैं दोनों एक) उप नियंत्रकों (मेरी नियंत्रकों के कुछ बहुत बड़ा मिल रहे थे) और ख) दृश्य साथ वे काम के लिए विशेष रूप दुकानों को परिभाषित करने के लिए अनुमति देने के लिए घटक और नियंत्रक करने के लिए नए प्रोटोटाइप विधियां जोड़कर अपने आवेदन पुनर्संशोधित है। मॉडल को अभी भी नियंत्रक पर परिभाषित किया जा सकता है, केवल हैंडलर द्वारा उपयोग की आसानी के लिए यदि आपको सर्वर से रिकॉर्ड पकड़ने की तरह कुछ करने की आवश्यकता है।

प्रश्न

MVC की मेरी समझ मुझे नेतृत्व को लगता है कि मॉडल और सीधे तो नियंत्रक से देखें से संबंधित होगा। मुझे लगता है कि एक्स्टजेस 4 लोड किए गए डेटा के पुन: उपयोग को प्रोत्साहित करने के उद्देश्यों के लिए नियंत्रकों को स्टोर्स (जो मुझे लगता है कि अधिक क्लासिक मॉडल के लिए रैपर के रूप में देखा जा सकता है) को संलग्न करने का निर्णय लेता है, और उसी वर्ग की कई प्रतियां प्राप्त करने से दूर करने के लिए instantiated। ऐसा लगता है कि, हालांकि, कोई ऐसा नहीं कर सकता है अगर कोई उपयोगकर्ता को उपलब्ध दृश्य के कई उदाहरणों का इरादा रखता है। मेरी सोच के लिए, ओओ ढांचे में कई उदाहरण होने का एक महत्वपूर्ण विकल्प है, इसलिए मैंने इस प्रवृत्ति को क्यों बढ़ाया है और कुछ अतिरिक्त बेस वर्गों पर प्रोटोटाइप लागू किए हैं। (धन्यवाद Ext.implement!)।

वहाँ बॉक्स से बाहर का उपयोग कर उन्हें में लोड अलग डेटा के साथ एक देखने के कई समवर्ती उदाहरण सामने आना कोई तरीका है MVC वर्गों और प्रदान की setters, टिककर खेल, आदि के बनाने का उपयोग करता है?

+1

तो यहां सवाल क्या है? मुझे ** प्रश्न ** अनुभाग में एक स्पष्ट, सुसंगत प्रश्न नहीं दिख रहा है। कृपया एक प्रश्न शामिल करने के लिए अपना प्रश्न अपडेट करें जिसका तथ्यों, संदर्भों, (विषयपरक रूप से, राय के साथ आदि) के साथ उत्तर दिया जा सकता है। – casperOne

+0

कोहेरेंसी – aenigmatic

+0

बढ़ी, धन्यवाद! – casperOne

उत्तर

0

बेशक। क्या आपको अन्यथा विश्वास करने का नेतृत्व किया? यहां एक कस्टम व्यू बनाने का एक उदाहरण है जो विंडो घटक से फैला हुआ है। आप इस विधि को एक ही नियंत्रक से कई बार चला सकते हैं और हर बार आपको एक दृश्य का एक नया उदाहरण मिल जाएगा।

 this.getRequestModel().load(requestID,{  //load from server (async) 
       success: function(record, operation) { 
         var view = Ext.widget('requestEdit',{ 
          title: 'MyRequest '+requestID 
         }); 
         var form = view.down('form'); 
         form.loadRecord(record); 
       } 
     }); 
+0

यह ठीक है, लेकिन यह वास्तव में एमवीसी पैकेज के भीतर काम नहीं कर रहा है। यह एक दृश्य में एक रिकॉर्ड भी लोड करता है। मैं संलग्न स्टोर्स के साथ कई दृश्य उदाहरण बनाने का जिक्र कर रहा हूं। – aenigmatic

+0

मुझे समझ में नहीं आता कि आप यहां क्या पूछ रहे हैं। क्या आप Ext.create ('MyView') कई बार उपयोग कर सकते हैं? हाँ। समस्या क्या है? – dbrin

2

मुझे नहीं लगता कि आप कभी भी, एक नियंत्रक के 1 से अधिक उदाहरण की जरूरत है, भले ही आप कितने दृश्य/मॉडल की है:

"इस" एक नियंत्रक कोड चलाता है कि में को दर्शाता है। कार्यात्मक उदाहरण देखें:

http://whatisextjs.com/extjs-4-extension/fieldset-w-dynamic-controls-7

+0

मुझे लगता है कि आप बिंदु खो रहे हैं। मुझे एक नियंत्रक के दृश्य के कई उदाहरणों की आवश्यकता है। – aenigmatic

+0

मुझे नियंत्रक के कई उदाहरणों की आवश्यकता है और आप जवाब वास्तव में सही है! – Oleg

0

आप अपने विचारों कैसे बनाऊं?मुझे कोई कारण नहीं दिख रहा है कि आप प्रत्येक ऑब्जेक्ट में एक अलग स्टोर या कॉन्फ़िगर डेटा क्यों नहीं दे सकते हैं। कुछ कोड नमूने आप वास्तव में क्या कर रहे हैं के लिए मदद करेंगे। उदाहरण के लिए, हमारे पास एक समान ध्वनि अनुप्रयोग है, और सबकुछ एक्सटेंशन के साथ किया जाता है। इसलिए, अगर हमें ग्रिड की आवश्यकता है, तो हम

Ext.define('MyApp.grids.something',{ 
extends:'Ext.grid.panel' 
//... 

ये कक्षाएं पूर्वनिर्धारित हैं। तब, जब एक नियंत्रक या दृश्य इस ग्रिड लोड कर रहा है, वे

var grid=Ext.create('MyApp.grids.something',{id:'unique',store:mystore}); 

उपयोग कर रहे हैं आप देख सकते हैं, हम हर बार बनाई गई है एक ही ग्रिड से अलग config विकल्पों में पारित कर सकते हैं। हम वास्तव में इस इलाज के रूप में आप

Ext.create('Ext.grid.Panel'); 

पाठ्यक्रम है कि हम कुछ विकल्प पूर्वनिर्धारित बनाने के अलावा, और कुछ गैर ओवरराइड करने योग्य, और इतने पर इलाज होता कर सकते हैं।

आशा है कि इससे मदद मिलेगी।

8

मैं एक ऐसी ही समस्या का सामना करना पड़ा:

एक सीआरएम प्रकार आवेदन जो प्रत्येक ग्राहक के लिए एक दृश्य के नए उदाहरणों को खोलता है के लिए एक tabpanel पर विचार करें। और कहें कि उस क्लाइंट से संबंधित डेटा के विभिन्न संग्रहों के साथ बातचीत करने के लिए टैब व्यू में 3 या 4 पंक्ति-संपादन ग्रिडपैन शामिल हैं।

मैं जिस समाधान के साथ आया था वह सेन्चा मंचों से this पर आधारित था। एक अखरोट खोल में, लगभग सभी घटनाओं को जो दृश्य से प्रेषित होते हैं, उनमें दृश्य का संदर्भ होता है। मेरे नियंत्रक के नियंत्रण में हैंडलर सभी सही दृश्य उदाहरण का संदर्भ प्राप्त करने के लिए इनका उपयोग करते हैं।

इस के लिए आवश्यक एक ही दुकान के कई उदाहरण के साथ काम के लिए, मुझे लगता है कि पद से दिल को यह ले लिया:

दृश्य या एक वैश्विक एक पर स्टोर उदाहरण के लिए ... पर निर्भर करता है जरूरत है। यदि आप वैश्विक स्तर पर उपयोग करने जा रहे हैं तो इसे वैश्विक बनाएं। यदि आप को केवल दृश्य पर इसकी आवश्यकता होगी तो इसे दृश्य पर रखें। एमवीसी कानून नहीं है, आप इसे अपनी आवश्यकताओं के अनुसार बदल सकते हैं। तकनीकी रूप से एमवीसी का नियंत्रक हिस्सा के बीच मध्य व्यक्ति होने का अनुमान है और मॉडल भागों को प्रदर्शित करता है लेकिन कभी-कभी इसकी आवश्यकता नहीं होती है। मैं स्टोर में 9 5% दृश्य में स्टोर बनाता हूं। मैं आपको एक उदाहरण दूंगा ...

यदि आपके पास उत्पादों के लिए स्टोर है, तो आपको शायद को संदर्भित करने की आवश्यकता है जो आपके ग्रिड में स्टोर करता है। आमतौर पर के अन्य हिस्सों के लिए यह आवश्यक नहीं है। हालांकि, अगर आप देशों लोड करने के लिए एक दुकान है, मैं अक्सर यह विश्व स्तर पर की जरूरत है तो मैं केवल एक बार इसे लोड करने के लिए है और यह कर सकते हैं तो सेट/उपयोग कि स्टोर कई दृश्य में।

इसलिए मैंने केवल आवश्यक स्टोर को बनाया है जो विशेष रूप से दृश्य के initComponent विधि के अंदर एक दृश्य उदाहरण से संबंधित है। इस एप्लिकेशन में कुछ वैश्विक स्टोर थे जिन्हें मैंने एमवीसी सिफारिशों के बाद स्टोर कक्षाओं के रूप में बनाया था। यह दृश्य के अंदर दृश्य उदाहरण स्टोर को समाहित करने के लिए अच्छी तरह से काम किया। तब मैं केवल नियंत्रक का एक उदाहरण की जरूरत है।

विशेष रूप से अपने सवाल का जवाब करने के लिए, वर्तमान में, वहाँ कोई ExtJS आधिकारिक सिफारिश या एक ही दृश्य है कि एक ही दुकान निर्माता का उपयोग के कई उदाहरण से निपटने के लिए config है। मैं कुछ समय बिताया है ऐसा ही कुछ और सबसे अच्छा मैं पाया है उनके मंच मध्यस्थों में से एक से इस सिफारिश था की तलाश में।

+0

ओपी * वास्तव में * इस जवाब को स्वीकार करने की जरूरत है! – HDave

2

यह आसानी से किया जा सकता है। आप कुछ नियमों का पालन करने की जरूरत है:

  1. लोड एप्लिकेशन स्टार्टअप पर अपने नियंत्रकों। उन्हें उतारो मत। स्मृति या समय के बारे में चिंता न करें, जब तक आप अपने जेएस को कम और संक्षिप्त करते हैं, तब तक सैकड़ों नियंत्रकों के लिए यह बहुत छोटा है।

  2. कभी भी नियंत्रक के रेफरी या दृश्य गुणों का उपयोग न करें। आप एक नियंत्रक के एक उदाहरण का उपयोग करने जा रहे हैं, लेकिन विचारों के कई उदाहरण हैं, इसलिए आप कभी भी एक संदर्भ का संदर्भ नहीं चाहते हैं।

  3. केवल ईवेंट श्रोताओं को नियंत्रकों में उपयोग करें। आप केवल अपने विचारों पर घटनाओं को सुनने जा रहे हैं। आप हैंडलर में "cmp" पैरामीटर के माध्यम से ईवेंट हैंडलर में किसी दृश्य के लिए हमेशा (अस्थायी) संदर्भ प्राप्त कर सकते हैं।

  4. एक दृश्य को "लॉन्च" करने के लिए, इसे बनाएं और इसे किसी अन्य दृश्य में जोड़ें। इसे नष्ट करने के लिए, इसे नष्ट कर दें। आप दृश्य को लॉन्च करने के लिए नियंत्रक का उपयोग नहीं करते हैं। आप तर्क जोड़ने के लिए नियंत्रक में afterrender और predestroy घटनाओं का उपयोग कर सकते हैं।

+0

अब तक, बहुत अच्छा है। लेकिन बनाए गए विचारों पर दुकानों की अनूठी प्रतियों के बारे में क्या? – HDave

1

ExtJS 'MVC में नियंत्रक आप देखने के लिए एक सिंगलटन है। मुझे पसंद है कि कैसे DeftJS एमवीसी के बारे में सोचता है। दृश्य के प्रत्येक उदाहरण में नियंत्रक का अपना उदाहरण होता है। इस तरह आप अपने दृश्य के किसी विशेष भाग के लिए नियंत्रक में सभी "नियंत्रण नियम" डाल सकते हैं, और यह तब दिखाई देगा जब दृश्य खुलता है।

मुझे कोई अनुभव नहीं था कि मैं एक ही प्रोजेक्ट में एकाधिक डिफॉल्ट जेएस ऐप्स का उपयोग कैसे कर सकता हूं।

0

this post देखें। जाहिर है

// .../app/view/Viewport.js 
Ext.define('MyApp.view.Viewport', { 
    // ... 
    items: [ 
     // ... 
     { xtype: 'testview', store: 'Store1', itemId: 'instance1' }, 
     { xtype: 'testview', store: 'Store2', itemId: 'instance2' } 
    ] 
}); 

स्टोर के साथ समस्या को हल किया जाएगा,: विचार वहाँ दृश्य config से कुछ विन्यास (जैसे store और itemId) लेने के लिए और यह व्यूपोर्ट config में डाल दिया है। विभिन्न itemId एस आपको ईवेंट को ठीक से संभालने में सक्षम बनाएगा।

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