সম্পত্তি 'এক্স' ব্যক্তিগত এবং কেবলমাত্র xyz কম্পোনেন্টের শ্রেণিতে প্রবেশযোগ্য


101

আমি এই ব্লগটি অনুসরণ করছি তার জন্য উত্পাদনের জন্য কৌনিক 2 অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি । আমার এনজিসি সফল সংকলনের পরে যখন টিএসসি সংকলনটি হয় এটি চিত্রের মধ্যে প্রদর্শিত ত্রুটির নীচে উত্পন্ন করে:

এখানে চিত্র বর্ণনা লিখুন

কিছুক্ষণ অনুসন্ধানের পরে আমি এই ব্লগটি পেয়েছি যা এতে সমস্যার ব্যাখ্যা দেয় "প্রসঙ্গের সম্পত্তি" বিভাগে যা আমি সঠিকভাবে বুঝতে পারছি না এটি হতে পারে যে আপনাকে কী ভুল হচ্ছে তা কিছুটা ভাল ধারণা দিতে পারে। মূলত যখন আমরা একটি ভেরিয়েবল প্রাইভেট তৈরি করি তখন আমরা "এআরআরআর: সম্পত্তিটি ব্যক্তিগত হয় এবং শ্রেণীর মধ্যে কেবল অ্যাক্সেসযোগ্য" । বুঝতে পারছি না কেন আসছে।

আমরা দু'দিন ধরে এই সমস্যায় মাথা নিচু করে দেওয়ার জন্য দয়া করে আমাদের সহায়তা করুন।


4
আপনি কি সম্পত্তিটি ব্যক্তিগত থেকে জনসাধারণে পরিবর্তনের চেষ্টা করেছেন?
জিন মেং

আপনি দয়া করে টিএস ফাইল সামগ্রী ভাগ করতে পারেন যা ত্রুটি ছুঁড়েছে?
রাজ

উত্তর:


143

প্রদত্ত উপাদানটির জন্য এটির টেমপ্লেট দ্বারা অ্যাক্সেস করা সমস্ত সদস্যের (পদ্ধতি, বৈশিষ্ট্য) অবশ্যই এওটি সংকলনের দৃশ্যে সর্বজনীন হতে হবে। এটি কোনও টেমপ্লেটকে টিএস শ্রেণিতে রূপান্তরিত করার কারণে ঘটে। উত্পন্ন শ্রেণি এবং একটি উপাদান এখন 2 পৃথক ক্লাস এবং আপনি ব্যক্তিগত সদস্যদের ক্রস-ক্লাস অ্যাক্সেস করতে পারবেন না।

সংক্ষেপে: আপনি সময়ের-সংকলনটি ব্যবহার করতে চাইলে আপনি নিজের টেম্পলেটগুলিতে ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারবেন না।

আরও ভাল ব্যাখ্যার জন্য https://github.com/angular/angular/issues/11422


কিন্তু এটি অ্যাঙ্গুলার এর আগের সংস্করণগুলিকে নষ্ট করেছিল, না? আমি নতুন সংস্করণে আপগ্রেড করার পরে এই ত্রুটিগুলি পেতে শুরু করেছি।
এমিল

36

হতে পারে আরও একটি সহজ উত্তর:

বন্ধুরা, দয়া করে এইচটিএমএল থেকে ব্যক্তিগত পদ্ধতি, ক্ষেত্র বা বৈশিষ্ট্যগুলি কল করবেন না :)


পিএস *.tsকোডটি সংকলন করার সময় *.js, এওটি এইচটিএমএল টেমপ্লেটের সাথে অ-সর্বজনীন সদস্যদের সংযোগ করতে অস্বীকার করে ।

এবং "হ্যাঁ" এটি আপনার বিল্ড পাইপলাইনটিকে ব্যর্থ করে দেবে: ডি


4
বা ব্যক্তিগত ক্ষেত্র / সম্পত্তি অ্যাক্সেস!
জেএমকে

@ আরসেন খাচাতুরিয়ান এটি মজাদার)
ভোডো 417

@ জেএমকে আমি আপনার পরামর্শ অনুসারে পোস্টটি আপডেট করেছি, ধন্যবাদ।
আর্সেন খাচাতুরিয়ান

@ ভুডো 417, মজার এবং সত্য;)। কখনও কখনও খুব একাডেমিক উত্তর সত্যিই যে কারও মনে উজ্জীবিত করতে পারে এবং আমাদের যতটা সম্ভব সহজ হওয়া দরকার।
আর্সেন খাচাতুরিয়ান

4
@ আরসেন খাচাতুরিয়ান সম্মতি, আর্সেন +++
ভোডো 417

17

আমি যখন কনস্ট্রাক্টরে ব্যক্তিগত ইনজেকটেবলগুলি ঘোষণা করি তখন এটি পেয়েছিলাম:

constructor(private service: SpecificObjectService) { }

এবং সেগুলি টেমপ্লেটে ব্যবহার করেছে:

*ngFor="let pd of service.listSpecificObject "

সমাধানটি হ'ল:

constructor(public service: SpecificObjectService) { }

16

সুতরাং আমি এই সমস্যাটি সংশোধন করব আমি এই সংক্ষিপ্ত এবং সহজ রাখব। এটি ঠিক করতে আমি এই ব্লগটি গভীরভাবে পড়েছি । বিভাগ হিসাবে " প্রসঙ্গের সম্পত্তি " এই সমস্যার সমাধানটি হ'ল আপনি যখন এওটি ( যেমন, সময়ের আগে ) দিয়ে আপনার বিল্ডটি তৈরি করছেন তখন সরাসরি ভিউতে এটি ব্যবহার করতে চাইলে কোনও প্রাইভেট ভেরিয়েবল ব্যবহার করবেন না বা তৈরি করবেন না for উত্পাদন।

*উদাহরণ স্বরূপ *

// 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;
    }
  }
}

আউটপুট: সম্পত্তি '_initial' ব্যক্তিগত এবং কেবলমাত্র 'তৃতীয় পক্ষী কম্পোনেন্ট' শ্রেণীর মধ্যে অ্যাক্সেসযোগ্য।

সমাধান:

private _initials: string;সহজভাবে এটি আপডেট করুন_initials: string;

এই উত্তরের জন্য হরিশ গাদিয়া আমাকে তার জন্য থানেক্সের জন্য কিছুটা সহায়তা দিন।


_nameসেখানে ব্যবহার করার দরকার নেই, এটি আপনি ব্যবহার করতে যেমন একইরকম this.এবং nameএটির স্থানীয় ভেরিয়েবল অন্যটি হতে পারেthis.name=name;
লাজারবানানা

@LazerBanana, কিন্তু this.name=nameমধ্যে set nameINF হয়। পুনরাবৃত্তি
vp_arth

@vp_arth? এক স্থানীয় এক বিশ্বব্যাপী? এমনকি একই নামের সাথে 2 টি ভিন্ন জিনিস, আমার ধারণা? আপনি কেন this.বিশ্বব্যাপী একটির দিকে ইঙ্গিত করতে ব্যবহার করেন তা
হ'ল

স্থানীয় / বৈশ্বিক অধীনে আপনার অর্থ কী? nameপরিবর্তনশীল নয়, এটি বস্তুর সম্পত্তি। this.name = nameসেটার ( set name(v){}) সেটারে ট্রিগার করবে object এটি পরীক্ষা করা এত সহজ: blitz Maximum call stack size exceeded
vp_arth

6

এটি আমার জন্য কাজ করে ছেলেরা: কেবল পরিষেবাগুলিকে জনসাধারণে পরিবর্তন করুন।

constructor(public service: SpecificObjectService) { }

অ্যাপ নির্মাণে কাজ করছে !!


সুতরাং উপরের টিআইবিএম এর উত্তর হিসাবে কম বিশদ উত্তর সহ ঠিক একই সমাধান।
অ্যাশ

0

ঠিক আছে দেখুন এটি সত্যিই একটি সাধারণ জাভাস্ক্রিপ্ট এস 6 সমস্যা, যদি আপনাকে অবশ্যই ডেটা টাইপ ব্যক্তিগত রাখতে হয় তবে আপনি এটি সহজভাবে করতে পারেন

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
) {}

গিথুব সিআই আমাকে সতর্কতা মেল না পাঠানো পর্যন্ত আমি এটিকে উপেক্ষা করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.