নোংরা $scopeবস্তু যাচাই করে
কৌণিক বস্তুগুলিতে একটি সাধারণ arrayপর্যবেক্ষক বজায় রাখে $scope। যদি আপনি কোন পরিদর্শন তাহলে $scopeআপনি দেখবেন যে এটি একটি রয়েছে arrayনামক $$watchers।
প্রতিটি প্রহরী এমন একটি objectযা অন্যান্য জিনিসের সাথে থাকে
- এমন একটি অভিব্যক্তি যা পর্যবেক্ষক নিরীক্ষণ করছেন। এটি কেবল একটি
attributeনাম বা আরও জটিল কিছু হতে পারে ।
- এক্সপ্রেশনটির একটি সর্বশেষ জ্ঞাত মান। এটি এক্সপ্রেশনটির বর্তমান গণিত মানের বিপরীতে চেক করা যায়। যদি মানগুলি পৃথক হয় তবে পর্যবেক্ষকটি ফাংশনটি ট্রিগার করবে এবং
$scopeমলিন হিসাবে চিহ্নিত করবে ।
- এমন একটি ফাংশন যা পর্যবেক্ষক মলিন হলে কার্যকর করা হবে।
পর্যবেক্ষকরা কীভাবে সংজ্ঞায়িত হয়
অ্যাঙ্গুলারজেএস-এ কোনও প্রহরীকে সংজ্ঞায়িত করার বিভিন্ন উপায় রয়েছে।
আপনি স্পষ্টভাবে $watchএকটি attributeচালু করতে পারেন $scope।
$scope.$watch('person.username', validateUnique);
আপনি {{}}আপনার টেম্পলেটটিতে একটি বিভাজন রাখতে পারেন (বর্তমানের জন্য আপনার জন্য একজন প্রহরী তৈরি করা হবে $scope)।
<p>username: {{person.username}}</p>
আপনি কোনও নির্দেশিকা যেমন ng-modelআপনার জন্য প্রহরীকে সংজ্ঞায়িত করতে চাইতে পারেন ।
<input ng-model="person.username" />
$digestচক্র তাদের শেষ মান বিরুদ্ধে সব প্রহরী পরীক্ষা
যখন আমরা সাধারণ চ্যানেলগুলির (এনজি-মডেল, এনজি-রিপিট, ইত্যাদি) মাধ্যমে অ্যাংুলারজেএসের সাথে যোগাযোগ করি তখন একটি ডাইজেস্ট চক্র নির্দেশের মাধ্যমে ট্রিগার করা হবে।
একটি ডাইজেস্ট চক্র এবং তার সমস্ত শিশুদের গভীরতার প্রথম ট্র্যাভারসাল$scope । প্রত্যেকের জন্য $scope object, আমরা এর উপর পুনরাবৃত্তি করি $$watchers arrayএবং সমস্ত এক্সপ্রেশন মূল্যায়ন করি। যদি নতুন এক্সপ্রেশন মানটি সর্বশেষ জ্ঞাত মান থেকে পৃথক হয়, তবে পর্যবেক্ষকের ফাংশনটি বলা হয়। এই ফাংশনটি ডমটির কিছু অংশ পুনরায় সংকলন করতে পারে, একটি মান পুনর্নির্মাণ করতে পারে $scope, ট্রিগার AJAX requestকরতে পারে, আপনার যা কিছু করার প্রয়োজন তা হচ্ছে।
প্রতিটি ক্ষেত্র অতিক্রম করা হয় এবং প্রতিটি ঘড়ির অভিব্যক্তি মূল্যায়িত হয় এবং শেষ মানেরটির বিপরীতে পরীক্ষিত হয়।
যদি কোনও নজরদারি ট্রিগার করা হয় তবে $scopeতা নোংরা
যদি কোনও প্রহরীকে ট্রিগার করা হয় তবে অ্যাপটি জানে যে কিছু পরিবর্তন হয়েছে এবং $scopeএটিকে নোংরা হিসাবে চিহ্নিত করা হয়েছে।
প্রহরী ফাংশনগুলি $scopeপিতামাতার উপর বা তার অন্যান্য বৈশিষ্ট্যগুলিকে পরিবর্তন করতে পারে $scope। যদি একটি $watcherফাংশন ট্রিগার করা হয়ে থাকে তবে আমরা গ্যারান্টি দিতে পারি না যে আমাদের অন্যান্য $scopeগুলি এখনও পরিষ্কার আছে এবং তাই আমরা পুরো ডাইজেস্ট চক্রটি আবার কার্যকর করি।
এটি কারণ AngularJS এর দ্বিমুখী বাইন্ডিং রয়েছে তাই $scopeগাছটিকে ব্যাক আপ করে ডেটা পাঠানো যেতে পারে । আমরা $scopeইতিমধ্যে হজম হয়ে গেছে এমন একটি উচ্চতার কোনও মান পরিবর্তন করতে পারি । সম্ভবত আমরা একটি মান পরিবর্তন $rootScope।
যদি $digestনোংরা হয়, আমরা $digestআবার পুরো চক্রটি কার্যকর করি
$digestডাইজেস্ট চক্রটি পরিষ্কার না হওয়া পর্যন্ত আমরা ক্রমাগতভাবে চক্রটি লুপ করি (সমস্ত $watchএক্সপ্রেশনগুলি পূর্ববর্তী চক্রের মতো একই মানের থাকে), বা আমরা ডাইজেস্ট সীমাতে পৌঁছে যাই। ডিফল্টরূপে, এই সীমাটি 10 এ সেট করা আছে।
আমরা যদি ডাইজেস্ট সীমাতে পৌঁছে যাই তবে AngularJS কনসোলে একটি ত্রুটি বাড়িয়ে তুলবে:
10 $digest() iterations reached. Aborting!
ডাইজেস্ট মেশিনে শক্ত তবে বিকাশকারীদের পক্ষে সহজ
যেমন আপনি দেখতে পাচ্ছেন, প্রতিবারই একটি কৌণিক জেএস অ্যাপ্লিকেশনে কিছু পরিবর্তন হওয়ার সাথে সাথে অ্যাঙ্গুলারজেএস $scopeকীভাবে প্রতিক্রিয়া জানাবে তা দেখতে শ্রেণিবদ্ধের প্রতিটি পর্যবেক্ষককে পরীক্ষা করবে । একজন বিকাশকারীর জন্য এটি একটি বিশাল উত্পাদনশীলতার वरदान, এখন আপনার প্রায় কোনও ওয়্যারিং কোড লেখার দরকার নেই, অ্যাঙ্গুলারজেএস কেবল মানটি পরিবর্তিত হয়েছে কিনা তা লক্ষ্য করবে এবং অ্যাপটির বাকী অংশটি পরিবর্তনের সাথে সামঞ্জস্য করবে।
মেশিনের দৃষ্টিকোণ থেকে যদিও এটি বুনোভাবে অদক্ষ এবং এটি আমাদের অ্যাপ্লিকেশনটিকে ধীর করে দিবে যদি আমরা খুব বেশি পর্যবেক্ষক তৈরি করি। পুরানো ব্রাউজারগুলিতে আপনার অ্যাপ্লিকেশনটি ধীরে ধীরে অনুভূত হওয়ার আগে মিসকো প্রায় 4000 পর্যবেক্ষকের একটি চিত্র উদ্ধৃত করেছেন।
উদাহরণস্বরূপ আপনি যদি ng-repeatবৃহত্তর বেশি হন তবে এই সীমাটি পৌঁছানো সহজ JSON array। আপনি প্রহরী তৈরি না করে কোনও টেমপ্লেট সংকলন করতে ওয়ান-টাইম বাইন্ডিংয়ের মতো বৈশিষ্ট্যগুলি ব্যবহার করে এর বিরুদ্ধে প্রশমিত করতে পারেন।
কীভাবে খুব বেশি পর্যবেক্ষক তৈরি করা এড়ানো যায়
প্রতিবার আপনার ব্যবহারকারী আপনার অ্যাপ্লিকেশনটির সাথে যোগাযোগ করে, আপনার অ্যাপ্লিকেশনটির প্রতিটি একক পর্যবেক্ষক কমপক্ষে একবার মূল্যায়ন করা হবে। অ্যাংুলারজেএস অ্যাপ্লিকেশনটি অনুকূলকরণের একটি বড় অংশ আপনার $scopeগাছের পর্যবেক্ষকদের সংখ্যা হ্রাস করছে । এটি করার একটি সহজ উপায় হ'ল ওয়ান টাইম বাইন্ডিং ।
যদি আপনার কাছে এমন ডেটা থাকে যা খুব কমই পরিবর্তিত হয়, আপনি কেবল :: সিনট্যাক্স ব্যবহার করে একবার এটি আবদ্ধ করতে পারেন, এর মতো:
<p>{{::person.username}}</p>
অথবা
<p ng-bind="::person.username"></p>
অন্তর্ভুক্ত টেমপ্লেটটি যখন রেন্ডার করা হয় এবং ডেটা লোড করা হয় তখনই বাইন্ডিংটি ট্রিগার করা হবে $scope।
এটি বিশেষত গুরুত্বপূর্ণ যখন আপনার ng-repeatঅনেকগুলি আইটেম থাকে।
<div ng-repeat="person in people track by username">
{{::person.username}}
</div>