"सज्जाकार" क्या हैं और उनका उपयोग कैसे किया जाता है?


148

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

जैसा कि कोणीय लोग इसे एक डेकोरेटर कहते हैं:

सेवा की सजावट, सज्जाकार को सेवा की आवृत्ति निर्माण को बाधित करने की अनुमति देती है। लौटा हुआ उदाहरण मूल उदाहरण या एक नया उदाहरण हो सकता है जो मूल उदाहरण को दर्शाता है।

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

मैं अभी भी एक AngularJS noob की तरह हूँ तो मुझे यकीन है कि यह सिर्फ अज्ञानता और / या बुरी आदतें हैं जिन्हें मैंने उठाया है।

जवाबों:


219

एक अच्छा उपयोग मामला $provide.decoratorतब होता है जब आपको कुछ तृतीय-पक्ष / अपस्ट्रीम सेवा पर मामूली "ट्वीक" करने की आवश्यकता होती है, जिस पर आपका मॉड्यूल निर्भर करता है, जबकि सेवा बरकरार रहती है (क्योंकि आप सेवा के मालिक / अनुरक्षक नहीं हैं)। यहां प्लंकर पर एक प्रदर्शन किया गया है।


6
बहुत बढ़िया उदाहरण। मैं वास्तव में सोच रहा था कि उनके साथ ध्यान केंद्रित किए बिना तीसरे पक्ष के मॉड्यूल कार्यक्षमता को कैसे बढ़ाया जाए
आर्थर कोवाक्स

5
क्या डेकोरेटर वास्तव में किसी सेवा के सभी उदाहरणों को चकमा देते हैं, या क्या वे सिर्फ उस मॉड्यूल को स्कॉप करते हैं जो उन्हें सजाता है? दूसरे शब्दों में, कहें कि मेरे पास मॉड्यूल ए है जो मॉड्यूल बी से एक सेवा को सजाता है। मेरे पास मॉड्यूल सी है जो मॉड्यूल ए और मॉड्यूल बी पर निर्भर करता है। मॉड्यूल सी के अंदर, मॉड्यूल बी से सेवा मूल या सजाया संस्करण है?
जॉन जैक्स

3
@JonJaques - यह एक महान प्रश्न है। मैं ऐसी स्थिति में नहीं आया हूं। अगर मैं अनुमान लगाता हूं, तो जो सेवा सी मॉड्यूल देखती है उसका संस्करण मॉड्यूल ए से सजाया जाना चाहिए, लेकिन मैं यह नहीं कह सकता कि जब तक मैं इसे स्वयं नहीं आजमाऊंगा। आप एक सरल प्लंकर / jsffidle क्यों नहीं लिखते हैं और इसके साथ प्रयोग करते हैं। यदि आप अपनी खोज को हमारे साथ साझा कर सकें तो यह बहुत बढ़िया होगा चीयर्स।
तमकिस्क्वार

6
@JonJaques - मेरी जिज्ञासा को रोक नहीं सका, इसलिए मैंने आपके प्रश्न, लिंक का उत्तर खोजने के लिए अपने मूल उदाहरण में कुछ पंक्तियाँ जोड़ीं । संक्षेप में, मेरी पिछली टिप्पणी में अनुमान सही है।
तमकिस्क्वार

17
फैक्ट्रियां, सेवाएं आदि एकल हैं (जैसा कि उन्हें प्रदान किया गया है), इसलिए एक बार सजाया गया, हमेशा सजाया गया।
फ्लेवर्सस्केप

66

डेकोरेटर हमें क्रॉस-कटिंग चिंताओं को अलग करने और "बुनियादी ढांचे" कोड के बारे में चिंता किए बिना सेवाओं को एकल-जिम्मेदारी-सिद्धांत को संरक्षित करने की अनुमति देते हैं।

सज्जाकारों के व्यावहारिक उपयोग:

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

इन सभी मामलों में, हम सेवा में कोड को इसकी मुख्य जिम्मेदारी तक सीमित करते हैं।


10

decoratorद्वारा बनाई गई सेवा आवृत्ति को बाधित कर सकता है factory, service, value, provider, और कुछ को बदलने के लिए विकल्प देता है जो instance(service)अन्यथा विन्यास योग्य नहीं है / विकल्पों के साथ।

उदाहरण के लिए, यह परीक्षण उद्देश्य के लिए नकली उदाहरण भी प्रदान कर सकता है $http


1
यह ध्यान देने योग्य है कि आप बेन नडेल द्वारा प्रस्तुतdirective परिभाषाओं को भी ओवरराइड कर सकते हैं
डेविड सलामन

यहाँ आधिकारिक कोणीय डॉक्स में संदर्भ दिया गया है: https://docs.angularjs.org/guide/decorators
डेविड सलामोन

3

सरल शब्द में हम कह सकते हैं कि यह एक विस्तार विधि की तरह है। एक्स के लिए। हमारे पास एक वर्ग है और इसकी दो विधियाँ हैं और समय के साथ हम इसमें और अधिक विधि जोड़ना चाहते हैं तब हम डेकोरेटर का उपयोग करते हैं।

हम स्थिरांक के साथ $ provide.decorator का उपयोग नहीं कर सकते क्योंकि हम स्थिरांक को बदल नहीं सकते हैं क्योंकि वे केवल संपत्ति पढ़ रहे हैं।


1

लघु सज्जाकार में निम्नानुसार वर्णित किया जा सकता है: -

एक डेकोरेटर फ़ंक्शन सेवा के निर्माण को स्वीकार करता है, जिससे यह सेवा के व्यवहार को ओवरराइड या संशोधित कर सकता है।

यह $provideकोणीय द्वारा सेवा का उपयोग करता है और किसी अन्य सेवा के कार्यान्वयन को संशोधित या प्रतिस्थापित करता है

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

उदाहरण:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

अनुप्रयोग

@JBland जवाब के अलावा।

  • एप्लिकेशन विस्तृत लोकेल सेटिंग: -

    आप यहां एक उदाहरण पा सकते हैं

  • कोणीय सेवा द्वारा किसी सेवा के मौजूदा व्यवहार और मौजूदा कार्यान्वयन को बदल देना: -

    आप यहां एक omeple पा सकते हैं

  • विभिन्न वातावरणों में एक फ़ंक्शन का स्विचिंग व्यवहार।

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