මෙහි ඇති බොහෝ පිළිතුරු වල හොඳ උපදෙස් අඩංගු වන අතර ව්යාකූලත්වයට ද හේතු විය හැක. සරලව භාවිතා $timeout
වේ නොහැකි හොඳම හෝ අයිතිය විසඳුමක්. එසේම, ඔබ කාර්ය සාධනය හෝ පරිමාණය පිළිබඳව සැලකිලිමත් වන්නේ නම් එය කියවීමට වග බලා ගන්න.
ඔබ දැනගත යුතු දේවල්
$$phase
රාමුවට පෞද්ගලික වන අතර ඒ සඳහා හොඳ හේතු තිබේ.
$timeout(callback)
වත්මන් ඩයිජෙස්ට් චක්රය (ඇත්නම්) සිදු වන තෙක් බලා සිටිනු ඇත, පසුව ඇමතුම ක්රියාත්මක කර අවසානයේ සම්පූර්ණ ලෙස ධාවනය කරන්න $apply
.
$timeout(callback, delay, false)
(කෝල්බැක් ක්රියාත්මක කිරීමට පෙර විකල්ප ප්රමාදයකින්) එයම කරනු ඇත, නමුත් $apply
ඔබ ඔබේ කෝණික ආකෘතිය (ope විෂය පථය) වෙනස් නොකළේ නම් කාර්ය සාධනය සුරකින (තෙවන තර්කය) වෙඩි තබන්නේ නැත .
$scope.$apply(callback)
වෙනත් දේ අතර ආයාචනා කරයි, $rootScope.$digest
එයින් අදහස් වන්නේ ඔබ හුදකලා විෂය පථයක සිටියත් යෙදුමේ මූල විෂය පථය සහ එහි සියලුම දරුවන් යළිත් වරක් යලි සකසනු ඇති බවයි.
$scope.$digest()
හුදෙක් එහි ආකෘතිය දර්ශනයට සමමුහුර්ත කරනු ඇත, නමුත් ඔබේ දෙමව්පියන්ගේ විෂය පථය ජීර්ණය නොකරනු ඇත, එමඟින් ඔබේ HTML හි හුදකලා කොටසක හුදකලා විෂය පථයක් සමඟ වැඩ කිරීමේදී බොහෝ කාර්ය සාධනයන් ඉතිරි කර ගත හැකිය (බොහෝ දුරට නියෝගයකින්). $ ඩයිජෙස්ට් නැවත ඇමතුමක් ගන්නේ නැත: ඔබ කේතය ක්රියාත්මක කර ජීර්ණය කරන්න.
$scope.$evalAsync(callback)
angularjs 1.2 සමඟ හඳුන්වා දී ඇති අතර බොහෝ විට ඔබගේ කරදර බොහොමයක් විසඳනු ඇත. ඒ ගැන වැඩි විස්තර දැන ගැනීමට කරුණාකර අවසාන ඡේදය බලන්න.
ඔබ එය ලබා ගන්නේ $digest already in progress error
නම්, ඔබේ ගෘහ නිර්මාණ ශිල්පය වැරදියි: එක්කෝ ඔබට ඔබේ විෂය පථය නැවත සකස් කිරීමට අවශ්ය නැත, නැතහොත් ඔබ එය භාර නොගත යුතුය (පහත බලන්න).
ඔබේ කේතය සැකසෙන ආකාරය
ඔබට එම දෝෂය ඇති වූ විට, ඔබ උත්සාහ කරන්නේ ඔබේ විෂය පථය දැනටමත් ක්රියාත්මක වෙමින් පවතින අතරතුර එය ජීර්ණය කිරීමට ය: එම අවස්ථාවේ දී ඔබේ විෂය පථයේ තත්වය ඔබ නොදන්නා බැවින්, එහි ජීර්ණය සමඟ කටයුතු කිරීමේ වගකීම ඔබ සතුව නැත.
function editModel() {
$scope.someVar = someVal;
/* Do not apply your scope here since we don't know if that
function is called synchronously from Angular or from an
asynchronous code */
}
// Processed by Angular, for instance called by a ng-click directive
$scope.applyModelSynchronously = function() {
// No need to digest
editModel();
}
// Any kind of asynchronous code, for instance a server request
callServer(function() {
/* That code is not watched nor digested by Angular, thus we
can safely $apply it */
$scope.$apply(editModel);
});
විශාල කෝණික යෙදුමක කොටසක් වන අතර ඔබ කරන්නේ කුමක්ද සහ හුදකලා කුඩා විධානයක් මත වැඩ කරන්නේ දැයි ඔබ දන්නේ නම්, කාර්ය සාධනය සුරැකීම සඳහා $ ඒ වෙනුවට ඩයිජෙස්ට් යෙදීමට කැමති විය හැකිය.
Angularjs 1.2 සිට යාවත්කාලීන කරන්න
ඕනෑම $ විෂය පථයට නව, බලවත් ක්රමයක් එකතු කර ඇත : $evalAsync
. මූලික වශයෙන්, එය සිදුවන්නේ නම් එය වත්මන් ඩයිජෙස්ට් චක්රය තුළ එහි ඇමතුම ක්රියාත්මක කරනු ඇත, එසේ නොමැති නම් නව ඩයිජෙස්ට් චක්රයක් නැවත ඇමතුම ක්රියාත්මක කිරීමට පටන් ගනී.
$scope.$digest
ඔබේ HTML හි හුදකලා කොටසක් පමණක් සමමුහුර්ත කිරීමට අවශ්ය බව ඔබ සැබවින්ම දන්නේ නම් එය තවමත් එතරම් හොඳ නැත ( $apply
කිසිවක් ක්රියාත්මක නොවන්නේ නම් නව එකක් අවුලුවනු ඇත), නමුත් ඔබ ශ්රිතයක් ක්රියාත්මක කරන විට හොඳම විසඳුම මෙයයි එය සමමුහුර්තව ක්රියාත්මක වේද නැද්ද යන්න ඔබට දැනගත නොහැක , උදාහරණයක් ලෙස හැඹිලිගත කළ හැකි සම්පතක් ලබා ගැනීමෙන් පසුව: සමහර විට මේ සඳහා සේවාදායකයෙකුට අසමමුහුර්ත ඇමතුමක් අවශ්ය වනු ඇත, එසේ නොමැතිනම් සම්පත දේශීයව සමමුහුර්තව ලබා ගනී.
මෙම අවස්ථා වලදී සහ ඔබ සතුව තිබූ අනෙක් සියල්ලම !$scope.$$phase
භාවිතා කිරීමට වග බලා ගන්න$scope.$evalAsync( callback )