AngularJS में एक निर्देश लिखते समय, मुझे यह कैसे तय करना चाहिए कि मुझे कोई नया स्कोप, एक नया चाइल्ड स्कोप या एक नया अलग स्कोप नहीं चाहिए?


265

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

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

मुझे पता है कि एक तत्व पर एक अलग दायरे के साथ एक निर्देश का उपयोग उसी (एक) अलग गुंजाइश का उपयोग करने के लिए एक ही तत्व पर अन्य निर्देशों को बाध्य करता है, इसलिए जब एक अलग गुंजाइश का उपयोग किया जा सकता है तो यह गंभीर रूप से सीमित नहीं होता है?

मैं उम्मीद कर रहा हूं कि कुछ कोणीय-यूआई टीम (या अन्य जिन्होंने कई निर्देश लिखे हैं) अपने अनुभव साझा कर सकते हैं।

कृपया एक उत्तर न जोड़ें, जो कहता है कि "पुन: प्रयोज्य घटकों के लिए एक अलग दायरे का उपयोग करें"।


"चाइल्ड स्कोप" से आपका मतलब "स्कोप। $ नया ()" द्वारा लिंक फंक्शन में स्कोप बनाना है? क्योंकि मुझे पता है, निर्देश में अलग-थलग गुंजाइश हो सकती है या नहीं है (इसलिए जहां गुंजाइश है उसका उपयोग किया जाएगा)
वैलेंटाइन श्योबोन

3
@ValentynShybanov सेटिंग स्वचालित रूप से scope: trueएक चाइल्ड स्कोप बनाएगी $scope.new()
जोश डेविड मिलर

2
@ वालेंटिन, जोश ने क्या कहा: इसलिए, तीन संभावनाएं हैं scope: false(डिफ़ॉल्ट, कोई नया दायरा नहीं), scope: true(नया दायरा जो प्रोटोटाइप को विरासत में मिला है), और scope: { ... }(नया अलग-अलग दायरा)।
मार्क राजकॉक

1
हाँ, thnx मैंने "सत्य" और "{}" के बीच के अंतर को याद किया है। जानकार अच्छा लगा।
वेलेन्टाइन श्योनोव

एक चौथा मामला है जिसे लोग आमतौर पर नजरअंदाज करते हैं .. वह है "निर्देशक नियंत्रक" .. मुझे लगता है कि सवाल का विस्तार करने के लिए उन्हें भी शामिल किया जाना चाहिए ... +1 से सवाल ..
गणराज

जवाबों:


291

क्या शानदार सवाल है! मैं यह सुनना पसंद करूंगा कि दूसरों को क्या कहना है, लेकिन यहां मेरे द्वारा उपयोग किए गए दिशानिर्देश हैं।

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

पैरेंट स्कोप: scope: false तो कोई नया स्कोप बिल्कुल नहीं

मैं इसे बहुत बार उपयोग नहीं करता, लेकिन जैसा कि @MarkRajcok ने कहा, यदि निर्देश किसी भी गुंजाइश चर का उपयोग नहीं करता है (और स्पष्ट रूप से कोई सेट नहीं करता है!) तो यह ठीक है जहां तक ​​मेरा संबंध है। यह बच्चे के निर्देशों के लिए भी उपयोगी है जो केवल माता-पिता के निर्देश के संदर्भ में उपयोग किए जाते हैं (हालांकि इसमें हमेशा अपवाद हैं) और इसका कोई खाका नहीं है। मूल रूप से टेम्पलेट के साथ कुछ भी एक दायरा साझा नहीं करता है, क्योंकि आप स्वाभाविक रूप से पहुंच और हेरफेर के लिए उस गुंजाइश को उजागर कर रहे हैं (लेकिन मुझे यकीन है कि इस नियम के अपवाद हैं)।

एक उदाहरण के रूप में, मैंने हाल ही में एक निर्देश बनाया है जो एसवीजी लाइब्रेरी मैं लिखने की प्रक्रिया में उपयोग करके एक स्थिर (स्थिर) वेक्टर ग्राफिक बनाता है। यह $observeदो विशेषताओं ( widthऔर height) का उपयोग करता है और अपनी गणना में उन का उपयोग करता है, लेकिन यह न तो कोई दायरा चर निर्धारित करता है और न ही कोई टेम्पलेट पढ़ता है। यह एक और गुंजाइश नहीं बनाने के लिए एक अच्छा उपयोग मामला है; हमें एक की आवश्यकता नहीं है, इसलिए परेशान क्यों हो?

लेकिन एक अन्य एसवीजी निर्देश में, हालांकि, मुझे उपयोग करने के लिए डेटा के एक सेट की आवश्यकता थी और इसके अलावा राज्य का एक छोटा सा स्टोर करना था। इस मामले में, माता-पिता के दायरे का उपयोग करना गैर जिम्मेदाराना होगा (फिर से, आम तौर पर बोलना)। तो इसकी बजाय...

बाल स्कोप: scope: true

एक बाल क्षेत्र के साथ निर्देश संदर्भ-जागरूक हैं और वर्तमान दायरे के साथ बातचीत करने का इरादा है।

जाहिर है, एक अलग दायरे से अधिक का मुख्य लाभ यह है कि उपयोगकर्ता किसी भी विशेषता पर प्रक्षेप का उपयोग करने के लिए स्वतंत्र है जो वे चाहते हैं; उदाहरण class="item-type-{{item.type}}"के लिए एक अलग दायरे के साथ एक निर्देश पर उपयोग करना डिफ़ॉल्ट रूप से काम नहीं करेगा, लेकिन एक बच्चे के दायरे के साथ एक पर ठीक काम करता है क्योंकि जो भी प्रक्षेपित होता है वह अभी भी डिफ़ॉल्ट रूप से मूल दायरे में पाया जा सकता है। साथ ही, निर्देश स्वयं माता-पिता को नुकसान या प्रदूषण के बारे में चिंता किए बिना अपने स्वयं के दायरे के संदर्भ में विशेषताओं और अभिव्यक्तियों का सुरक्षित रूप से मूल्यांकन कर सकता है।

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

मैं अपने आप को अलग-अलग या माता-पिता के scopes से अधिक बार बाल scopes का उपयोग कर पाते हैं।

अलग गुंजाइश: scope: {}

यह पुन: प्रयोज्य घटकों के लिए है। :-)

लेकिन गंभीरता से, मैं "पुन: प्रयोज्य घटकों" को "स्व-निहित घटकों" के रूप में मानता हूं। आशय यह है कि उनका उपयोग किसी विशिष्ट उद्देश्य के लिए किया जाना है, इसलिए उन्हें अन्य निर्देशों के साथ मिलाकर या DOM नोड में अन्य प्रक्षेपित विशेषताओं को जोड़कर स्वाभाविक रूप से कोई मतलब नहीं है।

अधिक विशिष्ट होने के लिए, इस स्टैंडअलोन कार्यक्षमता के लिए कुछ भी आवश्यक है, माता-पिता के दायरे के संदर्भ में मूल्यांकन की गई निर्दिष्ट विशेषताओं के माध्यम से प्रदान किया जाता है; वे या तो एक-तरफ़ा तार ('@'), एक-तरफ़ा भाव ('और'), या दो-तरफ़ा चर बाइंडिंग ('=') हैं।

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

एक अच्छा सर्वोत्तम अभ्यास जितना संभव हो उतना निर्देश लिंक और नियंत्रक कार्यों से अधिक टेम्पलेट-आधारित सामान को बाहर करना है। यह एक और "एपीआई-जैसा" कॉन्फ़िगरेशन बिंदु प्रदान करता है: निर्देश का उपयोगकर्ता बस टेम्पलेट को बदल सकता है! कार्यक्षमता सभी एक ही रही, और इसके आंतरिक एपीआई को कभी नहीं छुआ गया, लेकिन हम स्टाइल और डीओएम कार्यान्वयन के साथ गड़बड़ कर सकते हैं जितनी आवश्यकता हो। ui / बूटस्ट्रैप इस बात का एक बेहतरीन उदाहरण है कि यह कैसे किया जाए क्योंकि पीटर और पावेल कमाल के हैं।

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

इसे अधिक कार्यक्षमता या अधिक कार्यक्षमता के साथ घेरें, लेकिन निर्देश यह है कि यह पहले से ही है।

सभी ने कहा, मुझे ध्यान देना चाहिए कि एक अलग दायरे की कुछ सीमाओं (यानी सुविधाओं) के आसपास तरीके हैं, जैसा कि @ProLoser ने अपने जवाब में संकेत दिया था। उदाहरण के लिए, चाइल्ड स्कोप सेक्शन में, मैंने आइसोलेटेड स्कोप (डिफॉल्ट रूप से) का उपयोग करते समय नॉन-डायरेक्टिव विशेषताओं को तोड़ने पर इंटरपोलेशन का उल्लेख किया। लेकिन उपयोगकर्ता, उदाहरण के लिए, बस उपयोग कर सकता है class="item-type-{{$parent.item.type}}"और यह एक बार फिर काम करेगा। इसलिए अगर बच्चे के दायरे में एक अलग दायरे का उपयोग करने के लिए एक सम्मोहक कारण है, लेकिन आप इन सीमाओं में से कुछ के बारे में चिंतित हैं, तो जान लें कि यदि आप की जरूरत है तो आप उन सभी के आसपास काम कर सकते हैं।

सारांश

बिना किसी नए दायरे के निर्देश केवल-पढ़ने के लिए हैं; वे पूरी तरह से विश्वसनीय हैं (यानी ऐप में आंतरिक) और वे जैक को नहीं छूते हैं। चाइल्ड स्कोप वाले निर्देश कार्यक्षमता जोड़ते हैं, लेकिन वे केवल कार्यक्षमता नहीं हैं । अंत में, अलग-अलग स्कोप उन निर्देशों के लिए हैं जो संपूर्ण लक्ष्य हैं; वे स्टैंडअलोन हैं, इसलिए उन्हें ठीक करने के लिए ठीक है (और सबसे "सही")।

मैं अपने शुरुआती विचारों को बाहर निकालना चाहता था, लेकिन जैसा कि मैं अधिक चीजों के बारे में सोचता हूं, मैं इसे अपडेट करूंगा। लेकिन पवित्र बकवास - यह एक एसओ उत्तर के लिए लंबा है ...


पुनश्च: पूरी तरह से मूर्त, लेकिन जब से हम scopes के बारे में बात कर रहे हैं, मैं "प्रोटोटाइप" कहना पसंद करता हूं, जबकि अन्य "प्रोटोटाइप" पसंद करते हैं, जो अधिक सटीक लगता है लेकिन सिर्फ जीभ को अच्छी तरह से रोल नहीं करता है। :-)


धन्यवाद जोश, शानदार जवाब। मुझे इसके लिए लंबे उत्तर चाहिए थे। दो बातें जिनका मैंने पालन नहीं किया: 1) बच्चा गुंजाइश: "उपयोगकर्ता किसी भी विशेषता पर प्रक्षेप का उपयोग करने के लिए स्वतंत्र है जो वे चाहते हैं"। 2) अलग-अलग स्कोप: "या सभी नहीं, 'के मामले में?" "क्या आप उन पर थोड़ा विस्तार कर सकते हैं? (अगर आसान है तो टिप्पणी लिखने के बजाय अपनी पोस्ट को संपादित करने के लिए स्वतंत्र महसूस करें।)
मार्क राजकॉक

@MarkRajcok For (1), मैंने इसे थोड़ा कम अस्पष्ट बनाने के लिए बदल दिया - मुझे बताएं कि क्या मैं असफल था। (2) के लिए, यह एक टाइपो और खराब शब्दों का संयोजन था; मैंने उस पैराग्राफ को फिर से क्लियर कर दिया। मैंने एक अतिरिक्त उदाहरण या दो को भी जोड़ा, कुछ और चीजों को स्पष्ट किया और कुछ टाइपो को ठीक किया।
जोश डेविड मिलर

जैसा कि उत्तर में उल्लेख किया गया है - कोणीय के लिए बूटस्ट्रैप इन संयोजन का एक बड़ा उदाहरण है। मुझे मिला उदाहरण उदाहरण विशेष रूप से उपयोगी - GitHub - Accordion
CalM

आपने उल्लेख किया कि आप चाइल्ड स्कोप का सबसे अधिक उपयोग करते हैं, मैंने सोचा था कि निर्देशों का पुन: प्रयोज्य पैटर्न सबसे आम था और मैंने उन निर्देशों को लिखने से परहेज किया है जो केवल एक बार उपयोग करने के लिए थे। क्या यह संयुक्त राष्ट्र की जरूरत है? कभी-कभी जब मेरा HTML बहुत बड़ा हो जाता है तो मुझे लगता है कि मैं उस खंड को एक निर्देश में ले जाऊंगा, लेकिन इसका उपयोग केवल एक बार किया जाएगा ताकि मैं इसे html में छोड़ दूं।
user2483724

2
@ user2483724 एक बहुत ही गलत धारणा है कि "पुन: प्रयोज्य" निर्देश वे हैं जो एक अलग दायरे का उपयोग करते हैं; ऐसा नहीं। यदि आप पूर्व-पैक निर्देशों को देखते हैं, तो उनमें से कोई भी अलग-थलग स्कोप का उपयोग नहीं करता है - कुछ भी एक बच्चे की गुंजाइश नहीं है - लेकिन मैं आपको आश्वस्त करता हूं कि वे पुन: प्रयोज्य हैं! नियम यह होना चाहिए कि निर्देश के दायरे का उपयोग कैसे किया जाता है। यदि यह केवल एक फ़ाइल में स्थान बचाने के बारे में है, तो मुझे यकीन नहीं है कि एक निर्देश सबसे अच्छा तरीका है। यह डेवलपर के लिए प्रसंस्करण समय बढ़ाता है। लेकिन अगर आपको करना चाहिए, तो इसके लिए जाएं। या एक का उपयोग करें ngInclude। या इसे अपने निर्माण के हिस्से के रूप में करें। कई विकल्प!
जोश डेविड मिलर

52

मेरी व्यक्तिगत नीति और अनुभव:

पृथक: एक निजी सैंडबॉक्स

मैं बहुत सारे स्कोप तरीके और वैरिएबल बनाना चाहता हूं जो केवल मेरे निर्देशन द्वारा उपयोग किए जाते हैं और कभी भी उपयोगकर्ता द्वारा देखे या सीधे एक्सेस नहीं किए जाते हैं। मैं श्वेतसूची में यह बताना चाहता हूं कि मेरे लिए कौन सा स्कोप डेटा उपलब्ध है। मैं उपयोगकर्ता को मूल दायरे (अप्रभावित) में वापस कूदने की अनुमति देने के लिए ट्रांसकॉर्पोरेशन का उपयोग कर सकता हूं । मैं अपने चरों और तरीकों को ट्रांसकोडेड बच्चों के लिए सुलभ नहीं चाहता।

बाल: सामग्री का एक उपधारा

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

कोई नहीं: सरल, केवल पढ़ने के लिए निर्देश

मैं वास्तव में गुंजाइश तरीकों या चर के साथ गड़बड़ करने की जरूरत नहीं है। मैं शायद कुछ ऐसा कर रहा हूं, जिसका स्कोप से कोई लेना-देना नहीं है (जैसे कि सिंपल jQuery प्लगइन्स, वैरिफिकेशन इत्यादि को प्रदर्शित करना)।

टिप्पणियाँ

  • आपको अपने फैसले पर सीधे प्रभाव डालने की अनुमति नहीं देनी चाहिए। आप ng-model=$parent.myVal(बच्चे) या ngModel: '='(अलग-थलग) जैसी चीजों को करके अजीब व्यवहार को दरकिनार कर सकते हैं ।
  • आइसोलेट + ट्रांसक्लूड सभी सामान्य व्यवहार को निर्देशन और माता-पिता के दायरे में लौटने के लिए पुनर्स्थापित करेगा, इसलिए ऐसा न करें कि आपके निर्णय को प्रभावित करें।
  • गुंजाइश पर किसी के साथ गड़बड़ न करें क्योंकि यह डोम के निचले आधे हिस्से के लिए गुंजाइश पर डेटा डालने जैसा है लेकिन शीर्ष आधा नहीं है जो 0 अर्थ बनाता है।
  • निर्देशकीय प्राथमिकताओं पर ध्यान दें (इसके ठोस उदाहरण नहीं हैं कि यह चीजों को कैसे प्रभावित कर सकता है)
  • सेवाओं को इंजेक्ट करें या किसी भी स्कोप प्रकार के साथ निर्देशों में संचार करने के लिए नियंत्रकों का उपयोग करें। आप require: '^ngModel'मूल तत्वों में देखने के लिए भी कर सकते हैं।

1
मुझे इस भाग के बारे में गलतफहमी हो सकती है: "आइसोलेट + ट्रांसक्लूड सभी सामान्य व्यवहार को सिबलिंग निर्देशों को बहाल करेगा"। इस प्लंकर को देखें । आपको कंसोल में देखना होगा।
जोश डेविड मिलर

1
आपकी अंतर्दृष्टि / उत्तर के लिए धन्यवाद ProLoser। आप उन लोगों में से एक हैं जिन्हें मुझे उम्मीद थी कि अगर मैंने angularjs-ui टैग जोड़ दिया तो यह पोस्ट देख लेंगे।
मार्क राजकोक

@JoshDavidMiller जब एक ही DOM एलिमेंट पर निर्देशों के बारे में बात करते हैं तो चीजें और अधिक जटिल हो जाती हैं, और आपको इसके बजाय प्राथमिकता संपत्ति पर एक नज़र रखना शुरू कर देना चाहिए। ट्रांसकॉक्शन बच्चों की सामग्री के लिए अधिक प्रासंगिक है।
प्रोफ़ेसर

1
@ProLoser राइट, लेकिन मुझे यकीन नहीं है कि आपके उस कथन का क्या मतलब है। वे स्पष्ट रूप से बच्चों को प्रभावित करते हैं, लेकिन निर्देशों के दायरे उनके भाई के निर्देशों को कैसे प्रभावित करते हैं?
जोश डेविड मिलर

18

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

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

अगर आप जो निर्देश लिखने जा रहे हैं, वह सिर्फ डोम हेरफेर करने जा रहा है , जिसमें किसी भी आंतरिक स्थिति, या स्पष्ट गुंजाइश परिवर्तन (ज्यादातर बहुत सरल चीजें) की आवश्यकता नहीं है; के लिए जाना कोई नई गुंजाइश । (जैसे ngShow, ngMouseHover, ngClick, ngRepeat)

यदि आप जो निर्देश लिखने जा रहे हैं, वह मूल तत्व में कुछ तत्वों को बदलने की जरूरत है, लेकिन कुछ आंतरिक स्थिति को भी संभालने की जरूरत है, तो नए बच्चे के दायरे में जाएं । (जैसे ngController)

निर्देशों के लिए स्रोत कोड को देखना सुनिश्चित करें: https://github.com/angular/angular.js/tree/master/src/ng/directive
यह उनके बारे में सोचने के लिए बहुत मदद करता है।


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

और "माता-पिता के दायरे में कुछ तत्वों को बदलने की आवश्यकता" के बारे में भी - यदि आप बच्चे के दायरे में कुछ बदलाव करते हैं, तो माता-पिता के दायरे में आबाद नहीं होते हैं (जब तक कि आप गंदे $parentहैक का उपयोग नहीं करते हैं )। तो वास्तव में निर्देशों के लिए "चाइल्ड स्कोप्स" एक ऐसी चीज है जिसका उपयोग काफी पीछे की तरफ किया जाना चाहिए - जैसे ngRepeatकि प्रत्येक आइटम को दोहराने के लिए नए चाइल्ड स्कोप बनाता है (लेकिन यह भी इसका उपयोग करता है scope.$new();और नहीं scope: true
वैलेंटाइन श्योबानोव

1
आप एक ही तत्व के भीतर कई अलग-अलग स्कोप के लिए नहीं पूछ सकते हैं, जब तक आप उन्हें स्पष्ट रूप से नहीं बांधते हैं, तब तक आप मूल कार्यक्षेत्र में कार्यों तक नहीं पहुंच सकते हैं। (सौभाग्य ngClickआदि का उपयोग करते हुए ) आवश्यक है कि मैं सहमत हूं कि एक तरह का डिकोडिंग है, लेकिन आपको अभी भी माता-पिता के निर्देश के बारे में पता होना चाहिए। जब तक यह एक घटक की तरह है , मैं अलगाव के लिए जा रहा हूँ। निर्देश (कम से कम, उनमें से ज्यादातर) अत्यधिक पुन: प्रयोज्य होने के लिए हैं और अलगाव इसे तोड़ता है।
उमूर कोंटाकी

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

5
सबसे पहले, मुझे लगता है कि आप अलग-अलग स्कोपों ​​पर थोड़ा कठोर हैं। मुझे लगता है कि उनकी व्यापक प्रयोज्यता है कि आप उन्हें होने का श्रेय देते हैं और यह कि आपके द्वारा उपयोग किए जाने पर आपके द्वारा बताई गई कई चुनौतियों (सही) से बचने के तरीके हैं। मैं "अंतिम डेवलपर के लिए बहुत अधिक अनुकूलन नहीं" से असहमत हूं - विवरण के लिए मेरा जवाब देखें। उस ने कहा, आपका उत्तर न तो बुरा था और न ही गलत था और इसने प्रश्न को संबोधित किया, इसलिए मुझे यकीन नहीं है कि यह नीचे क्यों हुआ। तो, +1।
जोश डेविड मिलर

9

बस मैंने सोचा कि मैं अपनी वर्तमान समझ को जोड़ूंगा और यह अन्य जेएस अवधारणाओं से कैसे संबंधित है।

डिफ़ॉल्ट (उदा। घोषित या कार्यक्षेत्र नहीं: गलत)

यह वैश्विक चर का उपयोग करने के लिए दार्शनिक रूप से बराबर है। आपका निर्देश मूल नियंत्रक में सब कुछ एक्सेस कर सकता है लेकिन यह उन्हें प्रभावित कर रहा है और एक ही समय में प्रभावित हो रहा है।

गुंजाइश: {}

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

गुंजाइश: बच्चे

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


कुंजी यह है कि किसी भी निर्देश को किसी भी तरह से लिखा जा सकता है। अलग-अलग गुंजाइश की घोषणाएं आपको व्यवस्थित करने में मदद करने के लिए हैं। आप सब कुछ एक मॉड्यूल बना सकते हैं, या आप बस सभी वैश्विक चर का उपयोग कर सकते हैं और बहुत सावधान रह सकते हैं। रखरखाव में आसानी के लिए हालांकि तार्किक रूप से सुसंगत भागों में अपने तर्क को संशोधित करना बेहतर है। एक खुली घास का मैदान और एक बंद जेल-घर के बीच एक संतुलन है। इसका कारण यह है कि मुझे विश्वास है कि जब लोग इस बारे में सीखते हैं तो उन्हें लगता है कि वे इस बारे में सीख रहे हैं कि निर्देश कैसे काम करते हैं लेकिन वास्तव में वे कोड / तर्क संगठन के बारे में सीख रहे हैं।

एक और चीज़ जिसने मुझे यह पता लगाने में मदद की कि निर्देशन कैसे काम करता है, जो कि ngInclude के बारे में सीख रहा है। ngInclude html partials शामिल करने में आपकी मदद करता है। जब मैंने पहली बार निर्देशों का उपयोग करना शुरू किया, तो मैंने पाया कि आप अपने कोड को कम करने के लिए टेम्पलेट विकल्प का उपयोग कर सकते हैं, लेकिन मैं वास्तव में किसी भी तर्क को संलग्न नहीं कर रहा था।

बेशक कोणीय के निर्देशों और कोणीय-यूआई टीम के काम के बीच मुझे अभी तक अपना खुद का निर्देश नहीं बनाना है जो कुछ भी पर्याप्त करता है इसलिए इस पर मेरा दृष्टिकोण पूरी तरह से गलत हो सकता है।


2

मैं उमूर के साथ कंसर्ट करता हूं। सिद्धांत रूप में, अलग-अलग स्कैप्स अद्भुत और "पोर्टेबल" ध्वनि करते हैं, लेकिन गैर-तुच्छ कार्यक्षमता को शामिल करने के लिए मेरे ऐप के निर्माण में मुझे पूरी तरह से लिखने के लिए कई निर्देशों (कुछ दूसरों के अंदर नेस्टेड या उनमें विशेषताओं को जोड़ने) को शामिल करने की आवश्यकता हुई। स्वयं का HTML, जो एक डोमेन विशिष्ट भाषा का उद्देश्य है।

अंत में, यह बहुत ही अजीब है कि प्रत्येक वैश्विक या साझा मूल्य को एक निर्देश के प्रत्येक डोम आह्वान पर कई विशेषताओं के साथ श्रृंखला के नीचे से गुजारें (जैसा कि अलग-अलग गुंजाइश के साथ आवश्यक है)। यह सिर्फ डोम में बार-बार सब लिखने के लिए गूंगा दिखता है और यह अक्षम लगता है, भले ही ये साझा वस्तुएं हों। यह अनावश्यक रूप से निर्देश की घोषणाओं को भी जटिल करता है। $ माता-पिता को "पहुंच" तक पहुंचाने और निर्देशन एचटीएमएल से मूल्यों को हथियाने का वर्कअराउंड वेरी बैड फॉर्म की तरह लगता है।

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

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

- डी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.