संपत्ति 'X' निजी और केवल कक्षा 'xyzComponent' के भीतर सुलभ है


97

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

यहां छवि विवरण दर्ज करें

थोड़ी देर खोजने के बाद मुझे यह ब्लॉग मिला जो "संदर्भ संपत्ति" खंड में समस्या को बताता है जिसे मैं ठीक से समझ नहीं पा रहा हूं हो सकता है कि यह आपको कुछ अच्छा विचार दे सकता है कि क्या गलत हो रहा है। मूल रूप से जब हम एक परिवर्तनशील निजी बना रहे होते हैं तो हमें "ERROR: संपत्ति निजी और केवल कक्षा के भीतर सुलभ होती है" मिलती है । मुझे समझ नहीं आ रहा है कि यह क्यों आ रहा है।

कृपया हमारी मदद करें क्योंकि हम पिछले कुछ दिनों से इस समस्या में अपना सिर पीट रहे हैं।


1
क्या आपने निजी से सार्वजनिक संपत्ति को बदलने की कोशिश की है?
जिन मेंग

क्या आप ts फ़ाइल सामग्री को साझा कर सकते हैं जो त्रुटि फेंक रही है?
राजकिशोर साहू

जवाबों:


137

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

संक्षेप में: यदि आप आगे के संकलन का उपयोग करना चाहते हैं तो आप अपने टेम्पलेट्स में निजी सदस्यों तक नहीं पहुँच सकते।

बेहतर स्पष्टीकरण के लिए https://github.com/angular/angular/issues/11422


लेकिन यह कोणीय के पूर्व संस्करणों के मामले में नहीं था, नहीं? मैं उन त्रुटियों को नवीनतम संस्करण में अपग्रेड करने के बाद शुरू कर रहा हूं।
22

35

शायद एक और भी सरल जवाब है:

दोस्तों, कृपया HTML से निजी तरीके, क्षेत्र या गुण न बताएं :)


PS जब *.tsकोड को संकलित करता है *.js, तो AOT गैर-सार्वजनिक सदस्यों को HTML टेम्पलेट से जोड़ने से इनकार करता है ।

और "हाँ" यह आपके बिल्ड पाइपलाइन को विफल करने के लिए करेगा: डी


1
या निजी क्षेत्रों / संपत्तियों तक पहुंच!
JMK

@ ऐरसेन खाचरौतन यह अजीब है)
voodoo417

@JMK मैंने आपके सुझाव के अनुसार पोस्ट को अपडेट किया है, धन्यवाद।
आर्सेन खाचरौतन

@ voodoo417, मजाकिया और सच;)। कभी-कभी बहुत अकादमिक उत्तर वास्तव में किसी के भी दिमाग को उड़ा सकते हैं, और हमें बस उतना ही सरल होना चाहिए जितना हम कर सकते हैं।
आर्सेन खाचरौतन

1
@ ऐरसेन खाचरौतन सहमत, आर्सेन +++
voodoo417

16

इसलिए मैंने इस समस्या को ठीक किया, मैं इसे छोटा और सरल रखूँगा। इसे ठीक करने के लिए मैंने इस ब्लॉग को गहराई से पढ़ा । जैसा कि खंड " संदर्भ संपत्ति " में इस समस्या का समाधान यह है कि निजी चर का उपयोग या निर्माण न करें यदि आप इसे सीधे उस दृश्य में उपयोग करना चाहते हैं जब आपका निर्माण एओटी ( यानी, समय से आगे ) के साथ हो रहा हो उत्पादन।

*उदाहरण के लिए *

// component.ts
@Component({
  selector: 'third-party',
  template: `
    {{ _initials }}
  `
})
class ThirdPartyComponent {
  private _initials: string;
  private _name: string;

  @Input()
  set name(name: string) {
    if (name) {
      this._initials = name.split(' ').map(n => n[0]).join('. ') + '.';
      this._name = name;
    }
  }
}

आउटपुट: प्रॉपर्टी '_initials' निजी है और केवल कक्षा 'थर्डपार्टीकंपोनेंट' के भीतर उपलब्ध है।

उपाय:

private _initials: string;बस इसे अद्यतन करें_initials: string;

इस जवाब के लिए हरीश गाडिया ने मुझे इसके लिए कुछ मदद दी।


_nameवहाँ का उपयोग करने की जरूरत नहीं है , यह आप का उपयोग करने के लिए this.और nameइसके एक स्थानीय चर के रूप में एक ही हो सकता हैthis.name=name;
LazerBanana

@LazerBanana, लेकिन this.name=nameमें set nameinf है। पुनरावर्तन
vp_arth

@vp_arth? एक स्थानीय है एक वैश्विक है? यहां तक ​​कि एक ही नाम 2 अलग-अलग चीजों के साथ, मुझे लगता है? यही कारण है कि यू का उपयोग this.वैश्विक एक को इंगित करने के लिए
LazerBanana

आपको स्थानीय / वैश्विक के तहत क्या मतलब है? nameपरिवर्तनशील नहीं है, यह वस्तु गुण है। उस वस्तु पर this.name = nameसेटर ( set name(v){}) को ट्रिगर करेगा । तो इसे टेस्ट करना आसान है: ब्लिट्ज Maximum call stack size exceeded
vp_arth

16

मुझे यह तब मिला जब मैंने कंस्ट्रक्टर में निजी इंजेक्शन की घोषणा की:

constructor(private service: SpecificObjectService) { }

और उन्हें खाके में इस्तेमाल किया:

*ngFor="let pd of service.listSpecificObject "

समाधान है:

constructor(public service: SpecificObjectService) { }

6

यह मेरे लिए काम करता है दोस्तों: बस सेवा को जनता के लिए बदलें।

constructor(public service: SpecificObjectService) { }

उत्पादन में काम कर रहे ऐप !!


तो ऊपर @ TiyebM के उत्तर के रूप में कम विस्तृत जवाब के साथ सटीक एक ही समाधान।
ऐश

0

ठीक है, यह वास्तव में एक सरल जावास्क्रिप्ट es6 समस्या है, यदि आपको डेटा प्रकार को निजी रखना चाहिए तो आप बस ऐसा कर सकते हैं

privateAccess(){
     return this.cannotAccessByInstanceButStillNeeded
}

0

यदि आप राउटर को देखने में उपयोग करना चाहते हैं, तो कृपया इसे सार्वजनिक करें।

उदाहरण के लिए:

<button 
   [routerLink]="['/login']"
   [queryParams]="{redirectTo: router.url}"
   translate="Please sign in to use this feature"
/>
import { Router } from '@angular/router'; 

constructor(
   public router: Router; // don't make it private
) {}

मैंने इसे तब तक अनदेखा किया जब तक कि गितुब सीआई ने मुझे एक चेतावनी मेल नहीं भेजा।

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