ডক্স থেকে:
সনাক্তকরণ (): শূন্য
পরিবর্তন ডিটেক্টর এবং তার শিশুদের পরীক্ষা করে।
এর অর্থ হ'ল যদি এমন কোনও ঘটনা ঘটে থাকে যেখানে আপনার মডেলের অভ্যন্তরের কোনও কিছু (আপনার শ্রেণি) পরিবর্তিত হয়েছে তবে এটি দৃষ্টিভঙ্গিকে প্রতিফলিত করে না, আপনাকে সেই পরিবর্তনগুলি সনাক্ত করতে (স্থানীয় পরিবর্তনগুলি সনাক্ত করতে) এবং ভিউটি আপডেট করার জন্য অ্যাংুলারকে অবহিত করতে হবে।
সম্ভাব্য পরিস্থিতিগুলি হ'ল:
1- পরিবর্তন ডিটেক্টরটি ভিউ থেকে আলাদা করা হয় ( বিচ্ছিন্ন দেখুন )
2- একটি আপডেট হয়েছে তবে এটি কৌণিক অঞ্চলের মধ্যে ছিল না, সুতরাং কৌণিক এটি সম্পর্কে জানে না।
কোনও তৃতীয় পক্ষের ক্রিয়াকলাপ যখন আপনার মডেলটিকে আপডেট করেছে এবং আপনি তার পরে ভিউটি আপডেট করতে চান Like
someFunctionThatIsRunByAThirdPartyCode(){
yourModel.text = "new text";
}
এই কোডটি কৌণিক অঞ্চলের বাইরে সম্ভবত (সম্ভবত), আপনাকে সম্ভবত পরিবর্তনগুলি সনাক্ত করতে এবং ভিউটি আপডেট করার বিষয়টি নিশ্চিত করতে হবে, সুতরাং:
myFunction(){
someFunctionThatIsRunByAThirdPartyCode();
// Let's detect the changes that above function made to the model which Angular is not aware of.
this.cd.detectChanges();
}
দ্রষ্টব্য :
উপরের কাজ করার অন্যান্য উপায় রয়েছে, অন্য কথায়, কৌনিক পরিবর্তন চক্রের ভিতরে পরিবর্তন আনার অন্যান্য উপায়ও রয়েছে।
** আপনি এই অঞ্চলে তৃতীয় পক্ষের কার্যটি গুটিয়ে রাখতে পারেন could রুন:
myFunction(){
this.zone.run(this.someFunctionThatIsRunByAThirdPartyCode);
}
** আপনি একটি সেটটাইমআউট ভিতরে ফাংশন মোড়ানো করতে পারে:
myFunction(){
setTimeout(this.someFunctionThatIsRunByAThirdPartyCode,0);
}
3- এমন কিছু ঘটনাও রয়েছে যেখানে আপনি মডেলটি আপডেট করার পরে আপডেট করেন change detection cycle
, যেখানে এই ক্ষেত্রে আপনি এই ভয়ঙ্কর ত্রুটি পান:
"এটি যাচাই করার পরে অভিব্যক্তি পরিবর্তন হয়েছে";
এর সাধারণত অর্থ হয় (কৌণিক ভাষা থেকে):
আমি আপনার মডেলটিতে এমন একটি পরিবর্তন দেখেছি যা আমার গ্রহণযোগ্য উপায়ে (ইভেন্টস, এক্সএইচআর অনুরোধগুলি, সেটটাইমআউট এবং ...) এর ফলে ঘটেছিল এবং তারপরে আমি আপনার দৃষ্টিভঙ্গিটি আপডেট করতে আমার পরিবর্তন সনাক্তকরণ চালিয়েছি এবং এটি শেষ করেছি, তবে তার পরে অন্যটি ছিল আপনার কোডে ফাংশন যা মডেলটি আবার আপডেট করেছে এবং আমি আবার আমার পরিবর্তন সনাক্তকরণ চালাতে চাই না কারণ AngularJS এর মতো আর কোনও নোংরা চেকিং নেই: ডি এবং আমাদের একতরফা ডেটা প্রবাহ ব্যবহার করা উচিত!
আপনি অবশ্যই এই ত্রুটিটি দেখতে পাবেন: পি।
এটি ঠিক করার কয়েকটি উপায়:
1- যথাযথ উপায় : নিশ্চিত করুন যে আপডেটটি পরিবর্তন সনাক্তকরণ চক্রের অভ্যন্তরে রয়েছে (অ্যাঙ্গুলার 2 আপডেটগুলি একবারে প্রবাহিত হয় যা একবার হয়, তার পরে মডেলটি আপডেট করবেন না এবং আপনার কোডটিকে আরও ভাল জায়গায় / সময় নিয়ে যান)।
2- অলস উপায় : কৌনিক 2 কে খুশি করার জন্য আপডেটের পরে সনাক্ত করুন চেঞ্জস () চালান, এটি অবশ্যই সেরা উপায় নয়, তবে আপনি যেমনটি জিজ্ঞাসা করেছিলেন যে সম্ভাব্য পরিস্থিতিগুলি কী, এটি তাদের মধ্যে একটি।
এইভাবে আপনি বলছেন: আমি সত্যই জানি যে আপনি পরিবর্তনটি সনাক্ত করতে পেরেছিলেন তবে আমি আপনাকে আবার এটি করতে চাই কারণ আপনি চেকিং শেষ করার পরে আমাকে ফ্লাইতে কিছু আপডেট করতে হয়েছিল।
3- কোডটি একটি এর ভিতরে রাখুন setTimeout
, কারণ setTimeout
জোনের দ্বারা প্যাচ করা হয় এবং detectChanges
এটি শেষ হয়ে গেলে চলবে ।
ডক্স থেকে
markForCheck() : void
যাচাই করা হয়েছে এমন সমস্ত চেঞ্জডেস্টেকশনস্ট্রেজি পূর্বপুরুষকে চিহ্নিত করে।
অধিকাংশ ক্ষেত্রে এই প্রয়োজন যখন হয় ChangeDetectionStrategy আপনার উপাদানের হয় OnPush ।
অনপশ নিজেই এর অর্থ হ'ল, এর মধ্যে যদি কিছু ঘটে থাকে তবে কেবল পরিবর্তন সনাক্ত করুন:
1- উপাদানগুলির @ ইনপুটগুলির মধ্যে একটি সম্পূর্ণরূপে একটি নতুন মান দিয়ে প্রতিস্থাপিত হয়েছে, বা যদি সহজভাবে বলা যায়, যদি @ ইনপুট সম্পত্তির রেফারেন্স পুরোপুরি পরিবর্তিত হয়।
তাই আপনি যদি ChangeDetectionStrategy আপনার উপাদানের হয় OnPush এবং তারপর আপনি আছে:
var obj = {
name:'Milad'
};
এবং তারপরে আপনি এটিকে আপডেট / পরিবর্তন করুন:
obj.name = "a new name";
এটি আপত্তি রেফারেন্স আপডেট করবে না , অতএব পরিবর্তন সনাক্তকরণ চলে না, সুতরাং ভিউ আপডেট / মিউটেশনকে প্রতিফলিত করে না।
এই ক্ষেত্রে আপনাকে অ্যাঙ্গুলারটি ম্যানুয়ালি বলতে হবে ভিউটি পরীক্ষা করতে এবং আপডেট করতে (মার্কফোর্ড);
সুতরাং আপনি যদি এটি করেন:
obj.name = "a new name";
আপনার এটি করা দরকার:
this.cd.markForCheck();
বরং নীচে পরিবর্তনের ফলে সনাক্তকরণ চালানো হবে:
obj = {
name:"a new name"
};
যা সম্পূর্ণ পূর্ববর্তী আপত্তিটিকে নতুন করে প্রতিস্থাপন করেছে {}
;
2- একটি ইভেন্ট বা ক্লিকের মতো কিছু বা তার মতো বা শিশু উপাদানগুলির মতো কোনও ইভেন্ট ছুড়েছে event
ইভেন্টগুলি:
- ক্লিক
- keyup
- সাবস্ক্রিপশন ইভেন্ট
- প্রভৃতি
সংক্ষেপে:
detectChanges()
কৌণিক চলার পরে যখন আপনি মডেলটি আপডেট করেছেন তখন এটির পরিবর্তন সনাক্তকরণ ব্যবহার করুন, বা আপডেটটি কৌণিক বিশ্বে মোটেও হয়নি Use
ব্যবহারের markForCheck()
আপনি OnPush ব্যবহার করা হয় তবে করছি এবং আপনি বাইপাস করছি ChangeDetectionStrategy
কিছু ডেটা mutating দ্বারা অথবা আপনি একটি ভিতরে মডেল আপডেট করেছি setTimeout ;