Http://docs.angularjs.org/error/$rootScope:inprog দেখুন
সমস্যাটি দেখা দেয় যখন আপনার কাছে কোনও কল আসে যখন $apply
কখনও কখনও কৌণিক কোডের বাইরে অবিচ্ছিন্নভাবে চালিত হয় (কখন $ প্রয়োগ করা উচিত) ব্যবহার করা উচিত) এবং কখনও কখনও সিঙ্ক্রোনিকভাবে অ্যাংুলার কোডের ভিতরে (যা $digest already in progress
ত্রুটির কারণ হয় )।
এটি ঘটতে পারে, উদাহরণস্বরূপ, যখন আপনার কাছে এমন একটি গ্রন্থাগার রয়েছে যা অবিচ্ছিন্নভাবে কোনও সার্ভার থেকে আইটেমগুলি নিয়ে আসে এবং সেগুলি ক্যাশে করে। কোনও আইটেমটি প্রথমবারের জন্য অনুরোধ করা হলে এটি কোডটি কার্যকর করার ক্ষেত্রে অবরুদ্ধ না হওয়ার কারণে এটি অবিচ্ছিন্নভাবে পুনরুদ্ধার করা হবে। তবে দ্বিতীয় বার, আইটেমটি ইতিমধ্যে ক্যাশে রয়েছে যাতে এটি সিঙ্ক্রোনালি পুনরুদ্ধার করা যায়।
এই ত্রুটি প্রতিরোধের উপায়টি হল যে কোডটি কল করে $apply
তা অবিচ্ছিন্নভাবে চালিত হয়েছে তা নিশ্চিত করা । $timeout
দেরিতে সেট করতে 0
(যা পূর্বনির্ধারিত) এর সাথে একটি কোডের মধ্যে আপনার কোড চালিয়ে এটি করা যেতে পারে । তবে আপনার $timeout
কোডটির ভিতরে কল করা কল করার প্রয়োজনীয়তা সরিয়ে দেয় $apply
, কারণ $ সময়সীমা $digest
নিজে থেকে অন্য একটি চক্রকে ট্রিগার করবে , যার ফলে, সমস্ত প্রয়োজনীয় আপডেটিং ইত্যাদি করবে etc.
সমাধান
সংক্ষেপে, এটি করার পরিবর্তে:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
এটা কর:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
কেবলমাত্র কল করুন $apply
যখন আপনি কোডটি চালাচ্ছেন এটি সর্বদা কৌণিক কোডের বাইরে চালানো হবে (যেমন আপনার কলটি $ প্রয়োগ করা হবে এমন কলব্যাকের অভ্যন্তরে ঘটবে যা আপনার কৌণিক কোডের বাইরের কোড দ্বারা কল করা হয়)।
$timeout
ওভার ব্যবহারের ক্ষেত্রে কেউ যদি কিছু প্রভাবশালী অসুবিধাগুলি সম্পর্কে অবগত $apply
না হয় তবে আমি দেখতে পাই না যে আপনি কেন সর্বদা $timeout
(শূন্য বিলম্বের সাথে) পরিবর্তে ব্যবহার করতে পারেননি $apply
, কারণ এটি প্রায় একই জিনিসটি করবে।