Angular2 - ব্যক্তিগত ভেরিয়েবলগুলি টেমপ্লেটে অ্যাক্সেসযোগ্য হওয়া উচিত?


143

যদি কোনও privateউপাদানটি ক্লাসে কোনও ভেরিয়েবল ঘোষিত হয়, আমি কি সেই উপাদানটির টেমপ্লেটে এটি অ্যাক্সেস করতে সক্ষম হব?

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>{{title}}</h2>
      <h2>Hello {{userName}}</h2> // I am getting this name
    </div>
  `,
})
export class App {
  public title = 'Angular 2';
  private userName = "Test Name"; //declared as private
}

উত্তর:


226

না, আপনার টেম্পলেটগুলিতে ব্যক্তিগত ভেরিয়েবলগুলি ব্যবহার করা উচিত নয়।

যদিও আমি ড্রয়মুরের উত্তরটি পছন্দ করি এবং এতে নিখুঁত ধারণাগত যুক্তি দেখি, বাস্তবায়নের দিক দিয়ে এটি ভুল। টেমপ্লেটগুলি উপাদান শ্রেণীর মধ্যে বিদ্যমান নয়, তবে সেগুলির বাইরে রয়েছে। প্রমাণের জন্য এই রেপোটি একবার দেখুন ।

এটি কাজ করার একমাত্র কারণ টাইপস্ক্রিপ্টের privateকীওয়ার্ডটি সত্যই সদস্যকে ব্যক্তিগত করে তোলে না। জাস্ট-ইন-টাইম সংকলন রানটাইমের সময় একটি ব্রাউজারে ঘটে এবং জেএসের ব্যক্তিগত সদস্যদের কোনও ধারণা নেই (এখনও?)। আমাকে সঠিক পথে রাখার জন্য ক্রেডিট স্যান্ডার এলিয়াসের কাছে যায় ।

সঙ্গে ngcএগিয়ে অফ টাইম সংকলন, আপনি ত্রুটি যদি টেমপ্লেট থেকে উপাদানের ব্যক্তিগত সদস্যদের অ্যাক্সেস করার চেষ্টা করুন পাবেন। ক্লোন বিক্ষোভ রেপো, MyComponentসদস্যদের দৃষ্টিগোচর প্রাইভেটে পরিবর্তন করুন এবং চলার সময় আপনি সংকলন ত্রুটি পাবেন ngc। আগে-কাল-সংকলনের জন্য নির্দিষ্ট উত্তর এখানে is


6
এটি সেরা মন্তব্য এবং ইমো গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি এমন নয় যে আপনি একবার প্রেরণ করার পরে ব্যক্তিগত ভেরিয়েবলগুলি ব্যবহার করতে পারেন, আপনার উচিত .. কোড পরিষ্কার রাখুন!
স্যাম ভ্লোবার্গস

2
এই একমাত্র বৈধ উত্তর! আপনি যখন আপনার টেমপ্লেটে প্রাইভেট ভার ব্যবহার করেন তখন কোডলিজার আপনাকে সতর্ক করে।
maxime1992

7
এর সাথে আমার একমাত্র সমস্যা হ'ল আপনি কীভাবে প্রকৃত প্রকাশ্যে প্রকাশিত সদস্য যেমন @ ইনপুটস এবং আউটপুট সদস্যদের মধ্যে পার্থক্য করবেন যা আমরা কেবল আমাদের টেম্পলেটে প্রকাশ করতে চাই, বাইরের বিশ্বের নয়। আপনি যদি পুনরায় ব্যবহারযোগ্য উপাদানগুলি তৈরি করছেন যেখানে আপনি পদ্ধতি / সদস্যদের টেমপ্লেটে অ্যাক্সেসযোগ্য তবে অন্য উপাদানগুলিতে নয়। আমি মনে করি আসল উত্তরটি সঠিক। টেমপ্লেটগুলি উপাদানটির অংশ।
আশাগ

1
আমি @ অ্যাসগ্রের সাথে একমত - এবং কেবল ইনপুটস এবং আউটপুটগুলিকেই নয়। আমি যখন উপাদানগুলির মধ্যে যোগাযোগ করতে চাই তখন কী হবে , উদাহরণস্বরূপ তার সন্তানের মধ্যে পিতামাত্তর উপাদানটি ইনজেকশনের মাধ্যমে। সন্তানের উপাদানগুলি তারপরে পিতামাতার বাইরের বিশ্বে যে পদ্ধতিগুলি প্রকাশ করতে চায় কেবল তার পদ্ধতির পরিবর্তে পিতামাতার সমস্ত কিছু তার টেম্পলেটটিতে প্রকাশিত হতে পারে। কৌণিকের সীমাবদ্ধতার মধ্যে, এই উত্তরটি সঠিক থাকে, তবে আমি মনে করি না যে এই নকশাটি ভালভাবে বিবেচনা করা হয়েছে।
ড্যান কিং

এটি একটি ভাল উত্তর কারণ এটি Angular এর AOT সংকলনের মধ্যে সীমাবদ্ধতা এবং কীভাবে তাদের আশেপাশে যায় তার সমাধান করে। তবে আইএমও প্রশ্নটি ধারণাগত ছিল (উদ্দেশ্যমূলক বা না) or ধারণাগতভাবে, টেমপ্লেটগুলি শ্রেণিবিন্যাসের অংশ। টেমপ্লেটগুলি বর্গ বৃদ্ধি করে না এবং উত্তরাধিকার সূত্রে প্রবেশ করে না এবং এগুলি বাহ্যিকভাবে ইনস্ট্যান্টেড অবজেক্টগুলিতে অ্যাক্সেস করে না ... এটি অন্যভাবে। টেমপ্লেটগুলি ক্লাসের মধ্যেই সংজ্ঞায়িত করা হয় সুতরাং ধারণাগতভাবে তারা শ্রেণীর অংশ এবং ধারণাগতভাবে ব্যক্তিগত সদস্যদের অ্যাক্সেস থাকা উচিত।
এ-ডিডি

85

সম্পাদনা: এই উত্তরটি এখন ভুল। বিষয়টি পোস্ট করার সময় এই বিষয়ে কোনও সরকারী দিকনির্দেশনা ছিল না, তবে @ ইয়ারোস্লোভের (দুর্দান্ত, এবং সঠিক) উত্তরে যেমন ব্যাখ্যা করা হয়েছে, এখন আর তেমনটি নেই: কোডেলাইজার এখন হুঁশিয়ারি উচ্চারণ করেছেন এবং এওটি সংকলন উপাদানগুলির টেমপ্লেটে ব্যক্তিগত ভেরিয়েবলের রেফারেন্সে ব্যর্থ হবে will । এটি বলেছিল, একটি ধারণাগত স্তরে এখানে সমস্ত কিছু বৈধ থাকবে, সুতরাং আমি এই উত্তরটি উপকারী বলে মনে হচ্ছে এটি ছেড়ে দেব।


হ্যাঁ, এটি প্রত্যাশিত

মনে রাখবেন যে privateএবং অন্যান্য অ্যাক্সেস মডিফায়ারগুলি হ'ল টাইপস্ক্রিপ্ট কনস্ট্রাক্টস, অন্যদিকে কম্পোনেন্ট / কন্ট্রোলার / টেমপ্লেটটি কৌনিক গঠন যা টাইপস্ক্রিপ্ট সম্পর্কে কিছুই জানে না। অ্যাক্সেস মডিফায়ারগুলি ক্লাসগুলির মধ্যে দৃশ্যমানতা নিয়ন্ত্রণ করে : একটি ক্ষেত্র তৈরি করা অন্যান্য ক্লাসগুলিতে এর অ্যাক্সেস থেকে privateবাধা দেয় তবে টেমপ্লেট এবং নিয়ন্ত্রণকারী এমন জিনিস যা ক্লাসের মধ্যে বিদ্যমান ।

এটি প্রযুক্তিগতভাবে সত্য নয়, তবে (ক্লাসগুলি কীভাবে সজ্জকার এবং তাদের মেটাডেটার সাথে সম্পর্কিত তা বোঝার পরিবর্তে) এটি এইভাবে চিন্তা করা সহায়ক হতে পারে, কারণ গুরুত্বপূর্ণ বিষয় (আইএমএইচও) হ'ল টেম্পলেট এবং নিয়ামককে পৃথক হিসাবে চিন্তাভাবনা থেকে সরিয়ে নেওয়া সংস্থাগুলি গঠনের একীভূত অংশ হিসাবে তাদের ভাবনায় সত্তা - এটি এনজি 2 মানসিক মডেলের অন্যতম প্রধান বিষয়।

সেভাবে এটি সম্পর্কে চিন্তা করা, স্পষ্টতই আমরা প্রত্যাশা করি যে privateকোনও উপাদান শ্রেণীর ভেরিয়েবলগুলি তার টেমপ্লেটে দৃশ্যমান হবে, একই কারণে আমরা আশা করি যে সেগুলি privateশ্রেণীর পদ্ধতিতে দৃশ্যমান হবে ।


3
প্রথম, আমি ভেবেছিলাম ঠিক যেমন আপনি ড্রয়মুর করেছেন। তবে আমি tslint 4.02 এবং কোডলিজারকে 2.0.0-beta.1 এ আপগ্রেড করেছি এবং ভেরিয়েবলগুলি দেখার জন্য আমি ব্যক্তিগত ব্যবহার করতে পারি না বলে ভুল করেছিলাম। সুতরাং @ ইয়ারোস্লাভের উত্তরটি আরও উপযুক্ত বলে মনে হচ্ছে।
maxime1992

8
আমি একমত যে কোনও উপাদান মডেলটির ব্যক্তিগত ভেরিয়েবলগুলি দেখতে না পারা এটি বোঝা যায় না, সংকলনের সময় সেগুলি সম্ভবত একই শ্রেণিতে ছাঁটাই করা উচিত, মানে আমি আপনাকে উপাদান নির্দিষ্ট বৈশিষ্ট্য, বস্তু এবং ফাংশন প্রকাশ করতে হবে অন্যান্য সমস্ত উপাদান যাতে আপনি আপনার টেমপ্লেটে সেগুলি ব্যবহার করতে পারেন, বাহ্যিক টুইটগুলি বা কলগুলি উল্লেখ না করে সমাপ্ত উপাদানটিতে সম্ভাব্য অপ্রত্যাশিত আচরণের কারণ হতে পারে
ফেলিপ

1
@ ড্রুমুর, হ্যালো আমি কয়েক মাস ধরে কৌনিক কোডিং করছি। আমি এই সমস্যাটির সাথে মুখোমুখি হয়েছি। এ নিয়ে আর কোনও বিতর্ক আছে কি? আমি কোন প্যাটার্নটি অনুসরণ করব সে সম্পর্কে সুনির্দিষ্ট কিছু পাই না। তবে, এটি যতটা মূল্যবান, এটি কোড বিচ্ছিন্নতা লঙ্ঘন করে বলে মনে হচ্ছে।
এডগার

2
@ ড্রুমুওর, আমি অবশ্যই বলতে পারি যে আমি আপনার আনসার যুক্তির সাথে একমত আছি। এবং আমি আশঙ্কা করছি যে কৌণিক দলটি কিছুটা গণ্ডগোল করেছে। এওটি মোডে, তারা ব্যক্তিগত সদস্যদের অনুমতি দিচ্ছে না, যখন ডকসগুলিতে তারা অন্যথায় দাবি করে, যা ব্যক্তিগত সদস্যদের ক্ষেত্রে আপনার বিষয়টিকে একেবারে শক্তিশালী করছে এবং কেবল এই বিষয়টিতে আরও বিশৃঙ্খলা যুক্ত করছে adding দস্তাবেজ থেকে: "কৌণিক উপাদানটির অংশের টেম্পলেটটিকে উপাদানটির সাথে সম্পর্কিত হিসাবে বিবেচনা করে The উপাদান এবং এর টেমপ্লেট একে অপরকে পুরোপুরি বিশ্বাস করে Therefore সুতরাং, উপাদানটির নিজস্ব টেমপ্লেট * @ * ইনপুট ডিকোরিটারের সাথে বা ছাড়াই সেই উপাদানটির কোনও সম্পত্তিতে আবদ্ধ হতে পারে। "
ওরেলে ইরাকি

@ ড্র্রুমুর, দস্তাবেজের জন্য লিঙ্ক: কৌণিক.ইও / গিগাড / সাবট্রিবিউট -ডাইরেক্টিভস # অ্যাপেন্ডিক্স- কেন- অ্যাড- ইনপুট (আমি জানি এটি মূলত ইনপুট সাজসজ্জার দিকে ফোকাস করে, তবে তারা যে বিষয়ে কথা বলছে তার অনেকগুলি কেবলমাত্র সম্পর্কিত নয়) এটি)
ওরেলে ইরাকি

16

যদিও কোড উদাহরণটি ইঙ্গিত করে যে প্রশ্নটি টাইপস্ক্রিপ্ট সম্পর্কে এটির নেই ট্যাগ। Angular2 ডার্টের জন্যও উপলব্ধ এবং এটি ডার্টের জন্য একটি উল্লেখযোগ্য পার্থক্য।

ইন ডার্ট টেমপ্লেট ব্যক্তিগত ভেরিয়েবল উল্লেখ থাকতে পারে না কম্পোনেন্ট ক্লাসের কারণ ডার্ট টাইপ করা বিষয় বিপরীতে কার্যকরভাবে বাইরে থেকে ব্যক্তিগত সদস্যদের এক্সেস বাধা দেয়।

আমি তখনও @ ড্রুমুরগুলি উপাদান সম্পর্কে চিন্তাভাবনা করার পরামর্শটি ফিরে পেয়েছি এবং যদিও এটির একক হিসাবে এটির টেমপ্লেট।

আপডেট (টিএস) মনে হচ্ছে অফলাইন সংকলন সহ ব্যক্তিগত সম্পত্তিগুলিতে অ্যাক্সেসটি Angular2 TS তেও আরও সীমাবদ্ধ হয়ে যাবে https://github.com/angular/angular/issues/11422


2
প্রাইভেট ভেরিয়েবলগুলি দেখার পক্ষে অ্যাক্সেসযোগ্য হতে পারে তা সীমাবদ্ধ করার জন্য কি টাইপস্ক্রিপ্ট সংকলক থাকা সম্ভব?
ম্যাথু হারউড

আমি জানি না। আমি মনে করি না.
গন্টার জ্যাচবাউয়ার

2
আমি ভাবব যে তাদের ব্যক্তিগত রাখার ফলে উপাদানটি কতটা টেস্টযোগ্য তা কার্যকর হতে পারে? উদাহরণস্বরূপ, আমি যদি পরীক্ষার প্রসঙ্গে একটি উপাদান তৈরি করি, তবে টেমপ্লেট / শ্রেণির মিথস্ক্রিয়া কাজ করছে তা নিশ্চিত করার জন্য আমি আমার পরীক্ষার থেকে সেই ব্যক্তিগত পদ্ধতিগুলি কল করতে সক্ষম হব না। আমি এটি এখনও চেষ্টা করি নি, তাই যদি এটি স্পষ্ট হয় তবে আমাকে ক্ষমা করুন :)
স্যাম স্টোরি

ডার্টে আপনি পরীক্ষাগুলিতে ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারবেন না। এটি সমর্থন করা উচিত এবং প্রাইভেট এপিআই আদৌ পরীক্ষা করা উচিত কিনা তা নিয়ে প্রচুর আলোচনা (ভাষার স্বাধীন) is সর্বজনীন এপিআই পরীক্ষা করে প্রতিটি কোডের পথে পৌঁছাতে সক্ষম হওয়া উচিত। আমি মনে করি এটি সাধারণভাবে যুক্তিযুক্ত। ডার্টে প্রাইভেট লাইব্রেরি প্রতি (যা বেশ কয়েকটি ফাইল সমন্বিত থাকতে পারে) যা পাবলিক এপিআই বেশ বিস্তৃত করে তোলে - ইউনিট পরীক্ষার জন্য আইএমএইচও খুব প্রশস্ত।
গন্টার জ্যাচবাউয়ার

3

ব্যক্তিগত ভেরিয়েবলগুলি উপাদানগুলির টেমপ্লেটের মধ্যে ব্যবহার করা যেতে পারে। গাইডের জন্য কৌণিক 2 চিট শিট দেখুন: https://angular.io/docs/ts/latest/cookbook/comp घटक-communication.html#!# পিতা-মাতা- থেকে শিশু - সেটটার

টাইপস্ক্রিপ্টে ক্লাসের পাবলিক / প্রাইভেট সদস্যদের সম্পর্কে আরও বিশদ ব্যাখ্যা এখানে পাওয়া যাবে: https://www.typescriptlang.org/docs/handbook/classes.html

ডিফল্টরূপে সমস্ত সদস্য পাবলিক। ক্লাব-ইনস্ট্যান্সের সাথে উপাদানগুলি শ্রেণীর বাইরেও পাবলিক সদস্যদের অ্যাক্সেস করা যায়। তবে ব্যক্তিগত সদস্যরা কেবল শ্রেণীর সদস্যের কার্যক্রমেই অ্যাক্সেস করতে পারবেন।


আমি প্রথম লিঙ্কটি দেখেছি ( কৌণিক.ও / গাইড / কম্পোনেন্ট-ইনটেকশান#!# প্যারেন্ট- টু স্কুল-সেটটার ) এবং আমি কোথাও দেখতে পাচ্ছি না যে এটি টেমপ্লেটে ব্যক্তিগত ভেরিয়েবলগুলি ব্যবহার করা ঠিক আছে suggest বিপরীতে, তারা টেমপ্লেট থেকে ব্যক্তিগত ভেরিয়েবল অ্যাক্সেসের জন্য getters এবং setters ব্যবহার করে।
সেবাস্তিয়ান চারটিয়ার

3

একটি workaround টিএস ফাইল মধ্যে ব্যক্তিগত ভেরিয়েবল ব্যবহার এবং getters ব্যবহার করা যেতে পারে।

private _userName = "Test Name";
get userName() {
  return this._userName;
}

এটি একটি ভাল পদ্ধতির কারণ টিএস ফাইল এবং এইচটিএমএল স্বাধীন থাকে। আপনি টিএস ফাইলে _ ব্যবহারকারীর নাম পরিবর্তনশীল নামটি পরিবর্তন করলেও, আপনাকে টেমপ্লেট ফাইলে কোনও পরিবর্তন করতে হবে না।


আমি মনে করি তোমার দর্শন লগ করা _clientName করার _userName পরিবর্তন করেন, উদাহরণস্বরূপ, দৃঢ়তা, আপনি পরিবর্তন সংগ্রহকারী প্রয়োজন clientName পেতে ... তাই কোন জয় হয়
LeagueOfJava

এটি ব্যক্তিগত ভেরিয়েবলগুলির জন্য আন্ডারস্কোর ব্যবহারকারীর পক্ষে খারাপ অভ্যাস।
ফ্লোরিয়ান লেটজেব

1
@ ফ্লোরিয়ানলিটজেব সরকারী কৌণিক দস্তাবেজগুলি কেন এটি করে ? private _name = '';
ruffin

তারপরে এই কোড স্নিপেটটি সঠিকভাবে পর্যালোচনা করা হয়নি। তারা একটি স্টাইলের সম্মেলন অনুসরণ করে, যা এখানে স্টাইল গাইডে ঘোষণা করা হয়েছে । এবং তাদের পৃষ্ঠাতে টাইপ করা বিষয় শ্রেণীর বিভাগে এখানে আন্ডারস্কোর ব্যবহার করছে না।
ফ্লোরিয়ান লেটজেব 16

1
@ ফ্লোরিয়ানলিটজেব তাহলে রাফিন পোস্ট করা লিঙ্কে যেমন সেটার পদ্ধতিতে বাধা দেওয়ার প্রস্তাবিত সমাধান কী হবে? অর্থাত্ আপনার সেটারের ব্যক্তিগত ব্যাকিং ফিল্ডটিকে আপনি কী বলে?
এল রোনোকো

1

সংক্ষিপ্ত উত্তরটি হ'ল এটি নয় যে আপনি টেমপ্লেট থেকে ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে সক্ষম হবেন না কারণ এটি প্রযুক্তিগতভাবে টিএস ফাইল থেকে পৃথক।


0

Tsconfig.app.json- তে আপনি যদি সংকলক বিকল্পগুলিতে 'ফুলটাইপলেট টাইপচেক' বিকল্পটি সরবরাহ করেন তবে আপনি প্রকল্প নির্মানের সময় আপনার প্রকল্পের এইচটিএমএল ফাইলগুলিতে সমস্ত অবৈধ তথ্যসূত্র দেখতে পাবেন।

"angularCompilerOptions": {
"enableIvy": true,
"fullTemplateTypeCheck": true

}

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