कोणीय घटक में "निजी" और "सार्वजनिक"


120

मैं शामिल नहीं करते हैं निजी से पहले foo, loadBarऔर text, मेरा मानना है कि वे कर रहे हैं सार्वजनिक डिफ़ॉल्ट रूप से।

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

जब वे publicघटक में होते हैं तो क्या कोई उपयोग मामला है ?

एन्कैप्सुलेशन / सुरक्षा कारण के लिए, क्या मुझे हमेशा privateनीचे की तरह उन सभी को जोड़ना चाहिए ?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

धन्यवाद


सरल होने के लिए एक निजी फ़ंक्शन केवल घटक में उपयोग कर सकता है। अन्य घटक से एक निजी फ़ंक्शन तक पहुंचना संभव नहीं है। सेवा में मान लीजिए, यदि कोई फ़ंक्शन निजी घोषित करता है, तो इसे किसी अन्य घटक से एक्सेस नहीं किया जा सकता है।
केविन

जवाबों:


202

इस सवाल के जवाब में कहने के लिए बहुत कुछ है, ये पहले विचार हैं जो मेरे दिमाग में आए:

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

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

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

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

तो, आपके प्रश्न का मेरा उत्तर:

क्या मुझे हमेशा नीचे की तरह उन सभी के लिए निजी जोड़ना चाहिए?

एक जोरदार नहीं है । आपको हमेशा जोड़ना नहीं चाहिए privateक्योंकि ऐसा करने से आप कीवर्ड के उद्देश्य को पराजित करते हैं, क्योंकि यह अब किसी भी इरादे को इंगित नहीं करता है यदि आप इसे हर जगह डालते हैं: तो आप इसे कहीं भी नहीं डाल सकते हैं।


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

1
मैं कोणीय 2 ट्यूटोरियल को लाल कर देता हूं, और जब मुझे सार्वजनिक उपयोग करना चाहिए तो मैंने इसका पता नहीं लगाया। घटक संचार के लिए बहुत सारे वेरिएंट हैं: angular.io/docs/ts/latest/cookbook/… संभवत : हमें केवल इनपुट आउटपुट के माध्यम से परिभाषित गुणों और विधियों के लिए सार्वजनिक उपयोग करना चाहिए। लेकिन मुझे यकीन नहीं।
रसलान बोरोवोक

मुझे आमतौर पर 'पब्लिक' का उपयोग करना पड़ता है जब मैं कंस्ट्रक्टर में एक संपत्ति की घोषणा करता हूं जिसका उपयोग कक्षा के अंदर नहीं किया जाता है, लेकिन इसका उपयोग बाहर किया जाता है (अर्थात टेम्पलेट या किसी अन्य घटक के अंदर)।
टुल्लोमार्चेटो

18

@ ड्रूमोर उस निजी / सार्वजनिक उकसावे में एक अच्छा उत्तर प्रदान करता है जो इरादे के लिए उबलता है। लेकिन इंजेक्शन के निजी मूल्यों का उपयोग करते समय विचार करने के लिए कुछ और चीजें हैं:

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


अपने पहले बिंदु पर फिर से जाएं: उन त्रुटियों का किसी सदस्य के निजी या सार्वजनिक होने से कोई लेना-देना नहीं है, वे बस संकेत करते हैं कि एक का उपयोग नहीं किया गया है। यदि आपके प्रश्न निजी तौर पर सदस्यों को संदर्भित करने के बारे में थे, तो आपके दूसरे दो अंक मान्य होंगे , लेकिन ऐसा नहीं है। एक प्रश्न के लिए यहां देखें
आकर्षित

@ ड्रूमोर, आप सही हैं, और मैं समझता हूं कि वे संकेत देते हैं कि उनका उपयोग नहीं किया गया है। हालाँकि, सार्वजनिक चर का बाहरी रूप से उपयोग किया जा सकता है, इसलिए यह उस चेतावनी को कभी ट्रिगर नहीं करेगा । जैसे ही प्रश्न "घटक में सार्वजनिक होने पर कोई उपयोग मामला है?", मेरा मानना ​​है कि मेरे दूसरे और तीसरे अंक कम से कम एक उपयोग के मामले को इंगित करते हैं जब वे सार्वजनिक होते हैं , विशेष रूप से, जब आप टेम्पलेट में उनका उपयोग करना चाहते हैं। (जैसा कि उद्धृत पाठ में दर्शाया गया है)।
लुकास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.