তার আপনি দুটি সমাধান যেতে!
1. পরিবর্তন ChangeDetectionStrategy OnPush করতে
এই সমাধানের জন্য, আপনি মূলত কৌনিকটি বলছেন:
পরিবর্তনগুলি পরীক্ষা করা বন্ধ করুন; আমি কেবল তখনই করবো যখন আমার জানা দরকার
দ্রুত সমাধান:
আপনার উপাদানটি পরিবর্তন করুন যাতে এটি ব্যবহার করবে ChangeDetectionStrategy.OnPush
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
// ...
}
এটি দিয়ে জিনিসগুলি আর কাজ করবে বলে মনে হয় না। এর কারণ এখন থেকে আপনাকে detectChanges()
ম্যানুয়ালি অ্যাংুলার কল করতে হবে ।
this.cdr.detectChanges();
এখানে এমন একটি লিঙ্ক রয়েছে যা আমাকে চেঞ্জডিটেকশনস্ট্রেজি সঠিকভাবে বুঝতে সহায়তা করেছে :
https://alligator.io/angular/change-detection-strategy/
2. এক্সপ্রেশন চ্যাঞ্জডএফটারআইটি হাসবিন চেকডএরর বোঝা
এই ত্রুটির কারণ সম্পর্কে টোমোনারি_ট উত্তর থেকে এখানে একটি ছোট্ট নির্যাস এখানে দেওয়া হয়েছে , আমি কেবলমাত্র সেই অংশগুলি অন্তর্ভুক্ত করার চেষ্টা করেছি যা এটি বুঝতে সাহায্য করেছিল।
সম্পূর্ণ নিবন্ধটি এখানে প্রদর্শিত প্রতিটি পয়েন্ট সম্পর্কে বাস্তব কোড উদাহরণগুলি দেখায়।
মূল কারণটি কৌণিক জীবনচক্রের:
প্রতিটি ক্রিয়াকলাপের পরে কৌণিক মনে করে যে এটি কোনও অপারেশন করতে ব্যবহৃত মানগুলি values এগুলি উপাদান ভিউয়ের পুরাতনভ্যালুতে সম্পত্তিতে সংরক্ষিত আছে।
কৌনিকটি সমস্ত উপাদানগুলির জন্য সম্পন্ন হওয়ার পরে পরবর্তী ডাইজেস্ট চক্র শুরু হয় তবে অপারেশন সম্পাদনের পরিবর্তে এটি বর্তমান মানগুলিকে তুলনামূলকভাবে পূর্ববর্তী ডাইজেস্ট চক্রের সাথে স্মরণ করে ares
নিম্নলিখিত ক্রিয়াকলাপগুলি ডাইজেস্ট চক্রের পরীক্ষা করা হচ্ছে:
চেক করুন যে সন্তানের উপাদানগুলিতে নিচে দেওয়া মানগুলি সেই মানগুলির সাথে সমান হয় যা এই উপাদানগুলির বৈশিষ্ট্যগুলি এখন আপডেট করতে ব্যবহৃত হবে।
পরীক্ষা করুন যে ডিওএম উপাদানগুলি আপডেট করতে ব্যবহৃত মানগুলি একই উপাদানগুলির আপডেট করার জন্য ব্যবহৃত মানগুলির সাথে একই হয় এখন এটি একই সম্পাদন করে।
সমস্ত সন্তানের উপাদানগুলির জন্য চেক
এবং সুতরাং, তুলনা করা মানগুলি পৃথক হলে ত্রুটি নিক্ষেপ করা হয়। , ব্লগার ম্যাক্স কোরেটস্কিই বলেছেন:
অপরাধী সর্বদা শিশু উপাদান বা নির্দেশিকা।
এবং অবশেষে এখানে কিছু বাস্তব বিশ্বের নমুনা রয়েছে যা সাধারণত এই ত্রুটি ঘটায়:
- সেবা ভাগ
- সিঙ্ক্রোনাস ইভেন্ট সম্প্রচার
- গতিশীল উপাদান তাত্ক্ষণিক
প্রতিটি নমুনা এখানে পাওয়া যাবে (plunkr), আমার ক্ষেত্রে সমস্যাটি ছিল একটি গতিশীল উপাদান তাত্ক্ষণিক।
এছাড়াও, আমার নিজের অভিজ্ঞতার দ্বারা আমি দৃ avoid়ভাবে সবাইকে setTimeout
সমাধানটি এড়াতে পরামর্শ দিই , আমার ক্ষেত্রে "প্রায়" অসীম লুপ সৃষ্টি হয়েছে (21 টি কল যা আমি আপনাকে কীভাবে উস্কে দিতে পারি তা দেখাতে রাজি নই),
আমি সর্বদা কৌণিক জীবনচক্রের বিষয়টি মাথায় রাখার পরামর্শ দিচ্ছি যাতে আপনি যখন অন্য কোনও উপাদানটির মান পরিবর্তন করেন প্রতিবার তারা কীভাবে প্রভাবিত হবে সে বিষয়টি আপনি বিবেচনায় নিতে পারেন। এই ত্রুটির সাথে কৌণিক আপনাকে বলছে:
আপনি সম্ভবত এটি ভুল উপায়ে করছেন, আপনি কি ঠিক আছেন বলে নিশ্চিত?
একই ব্লগ আরও বলে:
প্রায়শই, স্থির পরিবর্তনটি ডায়নামিক উপাদান তৈরি করতে সঠিক পরিবর্তন সনাক্তকরণ হুক ব্যবহার করা হয়
আমার জন্য একটি সংক্ষিপ্ত গাইড কোডিং করার সময় নিম্নলিখিত দুটি বিষয় বিবেচনা করা ( আমি সময়ের সাথে সাথে এটি পরিপূরক করার চেষ্টা করব ):
- পরিবর্তে এটির সন্তানের উপাদানগুলি থেকে পিতামাতার উপাদানগুলির মানগুলি পরিবর্তন করা থেকে বিরত থাকুন: এটিকে তার পিতামাতার থেকে সংশোধন করুন।
- আপনি যখন ব্যবহার করেন
@Input
এবং @Output
নির্দেশাবলী উপাদানটি সম্পূর্ণরূপে শুরু না করা হয় ততক্ষণ লাইফাইসাইকেলের পরিবর্তনগুলি ট্রিগার করা এড়ানোর চেষ্টা করবেন।
- এগুলির অপ্রয়োজনীয় কলগুলি
this.cdr.detectChanges();
এড়াতে আরও ত্রুটিগুলি ট্রিগার করতে পারে, বিশেষত যখন আপনি প্রচুর গতিশীল ডেটার সাথে ডিল করেন
- যখন ব্যবহার
this.cdr.detectChanges();
বাধ্যতামূলক হয় তা নিশ্চিত করুন যে @Input, @Output, etc
ব্যবহার করা ভেরিয়েবলগুলি ( ) সঠিক সনাক্তকরণ হুক ( OnInit, OnChanges, AfterView, etc
) এ পূরণ করা / আরম্ভ করা হয়েছে
- যখন সম্ভব হয়, লুকানোর পরিবর্তে সরান , এটি 3 এবং 4 পয়েন্টের সাথে সম্পর্কিত।
এছাড়াও
আপনি যদি অ্যাংুলার লাইফ হুক পুরোপুরি বুঝতে চান তবে আমি আপনাকে অফিশিয়াল ডকুমেন্টেশনটি এখানে পড়ার পরামর্শ দিচ্ছি: