AngularJS: දෝෂය වළක්වා ගන්න $ විෂය පථය අමතන විට දැනටමත් ක්‍රියාත්මක වෙමින් පවතී. අයදුම් කරන්න ()


842

කෝණික ආකාරයකින් යෙදුමක් තැනූ දා සිට මගේ පිටුව මගේ විෂය පථයට යාවත්කාලීන කිරීමට අවශ්‍ය බව මම සොයා ගතිමි.

මෙය කිරීමට මා දන්නා එකම ක්‍රමය $apply()වන්නේ මගේ පාලකයන්ගේ සහ නියෝගයන්ගේ විෂය පථයෙන් ඇමතීමයි. මෙහි ඇති ගැටළුව නම් එය කියවන කොන්සෝලය වෙත දෝෂයක් විසි කිරීමයි:

දෝෂය: dig දැනටමත් ජීර්ණය වෙමින් පවතී

මෙම දෝෂය වළක්වා ගැනීමට හෝ එකම දේ වෙනස් ආකාරයකින් වෙනස් කර ගැනීමට යමෙක් දන්නවාද?


34
අපට භාවිතා කිරීම ඇත්තෙන්ම කලකිරීමට කරුණකි more වැඩි වැඩියෙන් අයදුම් කරන්න.
OZ_

මා ඇමතුමක් ගත්තද call කෝල්බැක් එකක අයදුම් කරන්න. මම තෙවන පාර්ශවීය පුස්තකාලයක් ඔවුන්ගේ සේවාදායකවල දත්ත වලට ප්‍රවේශ වීම සඳහා භාවිතා කරමි, එබැවින් මට $ http හි වාසිය ලබා ගත නොහැක, එසේම library http භාවිතා කිරීම සඳහා ඔවුන්ගේ පුස්තකාලය නැවත ලිවිය යුතු බැවින් මට අවශ්‍ය නැත.
ට්‍රෙවර්

45
use$timeout()
Onur Yıldırım

6
$ කල් ඉකුත්වීම (fn) + 1 භාවිතා කරන්න, එයට ගැටලුව විසඳිය හැකිය! $ විෂය පථය. $$ අදියර හොඳම විසඳුම නොවේ.
හියු ටැන්

1
කේතය / ඇමතුම් විෂය පථය පමණක් ආවරණය කරනවා. $ සිට අදාළ තුළ කල් ඉකුත්වීම් (නොවේ $ කල් ඉකුත්වන) සියල්ලන්ටම AJAX ශ්රිත (නොවේ $ http) සහ සිදුවීම් (නොවේ ng-*). එය එසේ නොවේ තියෙන්නේ බව, ඔබ (කල් ඉකුත්වන / Ajax / සිදුවීම් හරහා හැඳින්වේ බව) ශ්රිතයක් තුළ සිට එය කතා කරන්නේ නම්, සහතික මුලින් බර මත ධාවනය වෙමින්.
පැට්රික්

Answers:


664

මෙම රටාව භාවිතා නොකරන්න - මෙය විසඳීමට වඩා දෝෂ ඇති කරයි. එය යමක් සවි කර ඇතැයි ඔබ සිතුවත් එය එසේ නොවීය.

පරික්ෂා කිරීමෙන් $digestඔබට දැනටමත් ප්‍රගතියක් තිබේදැයි පරීක්ෂා කළ හැකිය $scope.$$phase.

if(!$scope.$$phase) {
  //$digest or $apply
}

$scope.$$phaseආපසු "$digest"හෝ "$apply"ඇත්නම් $digestහෝ $applyසිදු වෙමින් පවතී. මෙම රාජ්‍යයන් අතර ඇති වෙනස වන්නේ $digestවර්තමාන විෂය පථයේ සහ එහි දරුවන්ගේ ඔරලෝසු $applyසැකසීම සහ සියලු විෂය පථයන්හි මුරකරුවන් සැකසීමයි.

@ Dnc253 හි කාරණයට, ඔබ ඔබ ඇමතීම $digestහෝ $applyනිතර නිතර සොයා ගන්නේ නම් , ඔබ එය වැරදියි. DOM සිදුවීමක් කෝණික සීමාවෙන් පිටත වෙඩි තැබීමක ප්‍රති the ලයක් ලෙස විෂය පථය යාවත්කාලීන කිරීමට අවශ්‍ය වූ විට මට ජීර්ණය කළ යුතු බව මට සාමාන්‍යයෙන් පෙනේ. උදාහරණයක් ලෙස, ට්විටර් බූට්ස්ට්‍රැප් මොඩලයක් සැඟවී ඇති විට. සමහර විට DOM සිදුවීම $digestක්‍රියාත්මක වන්නේ ක්‍රියාත්මක වන විටය , සමහර විට එසේ නොවේ. ඒ නිසයි මම මෙම චෙක්පත භාවිතා කරන්නේ.

කවුරුහරි දන්නවා නම් වඩා හොඳ ක්‍රමයක් දැන ගැනීමට මම කැමතියි.


අදහස් වලින්: @anddoutoi විසිනි

angular.js විරෝධී රටා

  1. එසේ නොකරන්න if (!$scope.$$phase) $scope.$apply(), එයින් අදහස් වන්නේ ඔබ $scope.$apply()ඇමතුම් තොගයේ ප්‍රමාණවත් නොවන බවයි.

230
මට පෙනෙන පරිදි $ ඩයිජෙස්ට් / $ අයදුම් කිරීම පෙරනිමියෙන් මෙය කළ යුතුය
රෝයි ට ru ලොව්

21
සමහර අවස්ථාවලදී මා විසින් පරීක්ෂා කළ යුතු නමුත් වර්තමාන විෂය පථය සහ මූල විෂය පථය සැලකිල්ලට ගන්න. මම මූලයේ $$ අදියර සඳහා වටිනාකමක් ලබාගෙන ඇති නමුත් මගේ විෂය පථයට නොවේ. එය
නියෝගයක

106
"කිරීම නවත්වන්න if (!$scope.$$phase) $scope.$apply()", github.com/angular/angular.js/wiki/Anti-Patterns
anddoutoi

34
danddoutoi: එකඟ විය; ඔබේ සබැඳිය පැහැදිලිවම මෙය විසඳුම නොවන බව පැහැදිලි කරයි; කෙසේ වෙතත්, "ඔබ ඇමතුම් තොගයේ ප්‍රමාණවත් නොවේ" යන්නෙන් අදහස් කරන්නේ කුමක්දැයි මට අවිනිශ්චිතය. මෙහි තේරුම කුමක්දැයි ඔබ දන්නවාද?
ට්‍රෙවර්

13
rehthreed: aaronfrost විසින් පිළිතුර බලන්න. නිවැරදි ක්‍රමය වන්නේ ඊළඟ චක්‍රයේ දී ජීර්ණය අවුලුවාලීම සඳහා ඩිෆර් භාවිතා කිරීමයි. එසේ නොවුවහොත් සිදුවීම නැති වී යන අතර විෂය පථය කිසිසේත් යාවත්කාලීන නොවේ.
මාරෙක්

666

මෙම මාතෘකාව පිළිබඳ කෝණික පිරිමි ළමයින් සමඟ මෑතකදී කළ සාකච්ඡාවකින්: අනාගතය සනාථ කිරීමේ හේතු සඳහා, ඔබ භාවිතා නොකළ යුතුය$$phase

එය කිරීමට "නිවැරදි" මාර්ගය සඳහා එබූ විට, පිළිතුර දැනට පවතී

$timeout(function() {
  // anything you want can go here and will safely be run on the next digest.
})

ෆේස්බුක්, ගූගල් සහ ට්විටර් ඒපීඅයි විවිධ මට්ටම්වලට ඔතා ගැනීම සඳහා කෝණික සේවාවන් ලිවීමේදී මම මෑතකදී මෙය වෙතට ගියෙමි.

සේවාවක් තුළ සිට උදාහරණයක් මෙන්න. (සංක්ෂිප්තතාවය සඳහා, විචල්‍යයන් සැකසීම, එන්නත් කරන ලද $ කල් ඉකුත් වීම ආදිය - ඉතිරි සේවාව අත්හැර දමා ඇත.)

window.gapi.client.load('oauth2', 'v2', function() {
    var request = window.gapi.client.oauth2.userinfo.get();
    request.execute(function(response) {
        // This happens outside of angular land, so wrap it in a timeout 
        // with an implied apply and blammo, we're in action.
        $timeout(function() {
            if(typeof(response['error']) !== 'undefined'){
                // If the google api sent us an error, reject the promise.
                deferred.reject(response);
            }else{
                // Resolve the promise with the whole response if ok.
                deferred.resolve(response);
            }
        });
    });
});

$ කල් ඉකුත්වීම සඳහා වන ප්‍රමාද තර්කය අත්‍යවශ්‍ය නොවන අතර එය සකසා නොමැති නම් පෙරනිමියෙන් 0 ක් වනු ඇත ( $ කල් ඉකුත් වූ ඇමතුම් $ browser.defer ප්‍රමාදයක් සකසා නොමැති නම් එය පෙරනිමි 0 වේ )

ටිකක් බුද්ධිමත් නොවන, නමුත් එය කෝණික ලියන පිරිමි ළමයින්ගේ පිළිතුරයි, එබැවින් එය මට ප්‍රමාණවත්ය!


5
මගේ විධානයන් අනුව මම බොහෝ වාර ගණනක් මේ සඳහා දිව ගියෙමි. Redactor සඳහා එකක් ලියමින් සිටි අතර මෙය පරිපූර්ණව ක්‍රියාත්මක විය. මම බ්‍රැඩ් ග්‍රීන් සමඟ හමුවක යෙදී සිටි අතර ඔහු කියා සිටියේ ජේඑස් හි ස්වදේශික නිරීක්ෂණ හැකියාව සහ බ්‍රවුසර් නොමැති පොලිෆිල් භාවිතා කරමින් ඩයිජස්ට් චක්‍රයක් නොමැතිව කෝණික 2.0 විශාල වනු ඇති බවයි. එම අවස්ථාවේදී අපට මෙය තවදුරටත් කිරීමට අවශ්‍ය නොවනු ඇත. :)
මයිකල් ජේ. කැල්කින්ස්

$ කල් ඉකුත්වීම ඇතුළත selectize.refreshItems () ඇමතීමෙන් භයානක පුනරාවර්තන ඩයිජස්ට් දෝෂයක් ඇති වූ බව මම ඊයේ දුටුවෙමි . එය කෙසේ විය හැකිදැයි යම් අදහසක් තිබේද?
iwein

3
ඔබ $timeoutස්වදේශිකයාට වඩා භාවිතා කරන්නේ නම්, ඔබ ස්වදේශිකයා වෙනුවට setTimeoutභාවිතා නොකරන්නේ ඇයි ? $windowwindow
ලීජී

2
EeLeeGee: මෙම අවස්ථාවේ දී භාවිතා $timeoutකළ යුතු කාරණය නම්, $timeoutකෝණික විෂය පථය නිසියාකාරව යාවත්කාලීන වන බව සහතික කිරීමයි. $ ඩයිජස්ට් එකක් ක්‍රියාත්මක නොවන්නේ නම්, එය නව $ ඩයිජෙස්ට් එකක් ධාවනය කිරීමට හේතු වේ.
විස්මය

2
bwebicy එය දෙයක් නොවේ. $ කල් ඉකුත් වූ ශ්‍රිතයේ සිරුර ක්‍රියාත්මක වන විට, පොරොන්දුව දැනටමත් විසඳා ඇත! එයට කිසිම හේතුවක් නැහැ cancel. සිට ලේඛන : "මෙහි ප්රතිඵලයක් වශයෙන්, එම පොරොන්දුව ප්රතික්ෂේප කිරීම සමග නිරාකරණය කරනු ඇත." ඔබට ස්ථිර පොරොන්දුවක් විසඳිය නොහැක. ඔබගේ අවලංගු කිරීම කිසිදු දෝෂයක් ඇති නොකරනු ඇත, නමුත් එය ධනාත්මක කිසිවක් නොකරනු ඇත.
daemonexmachina

324

ඩයිජෙස්ට් චක්‍රය යනු සමමුහුර්ත ඇමතුමකි. එය සිදු වන තුරු එය බ්‍රව්සරයේ සිදුවීම් ලූපයට පාලනය නොකරයි. මේ සමඟ කටයුතු කිරීමට ක්‍රම කිහිපයක් තිබේ. මෙය සමඟ ගනුදෙනු කිරීමට ඇති පහසුම ක්‍රමය නම් ඉදිකරන ලද $ කල් ඉකුත්වීම භාවිතා කිරීමයි, දෙවන ක්‍රමය නම් ඔබ අවධාරනය හෝ ලොඩාෂ් භාවිතා කරන්නේ නම් (සහ ඔබ විය යුතුය), පහත සඳහන් දේ අමතන්න:

$timeout(function(){
    //any code in here will automatically have an apply run afterwards
});

හෝ ඔබට ලොඩාෂ් තිබේ නම්:

_.defer(function(){$scope.$apply();});

අපි වැඩමුළු කිහිපයක් අත්හදා බැලූ අතර, අපගේ සියලු පාලකයන්, නියෝග සහ සමහර කර්මාන්තශාලාවලට පවා root රූට්ස්කෝප් එන්නත් කිරීම අපි පිළිකුල් කළෙමු. ඉතින්, $ කල් ඉකුත් වීම සහ _.ඩෙෆර් මෙතෙක් අපගේ ප්‍රියතම විය. මෙම ක්‍රම මඟින් සාර්ථකව කෝණික ලෙස ඊළඟ සජීවිකරණ ලූපය තෙක් රැඳී සිටින ලෙස ඉල්ලා සිටින අතර එමඟින් වත්මන් විෂය පථය සහතික කෙරේ.


2
මෙය $ කල් ඉකුත් වීම (...) සමඟ සැසඳිය හැකිද? ඊලඟ සිදුවීම් චක්‍රයට කල් දැමීමට මම අවස්ථා කිහිපයකදී $ කල් ඉකුත්වීම භාවිතා කර ඇති අතර එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ - $ කල් ඉකුත්වීම භාවිතා නොකිරීමට හේතුවක් තිබේදැයි යමෙක් දන්නවාද?
ට්‍රෙවර්

9
මෙය සැබවින්ම භාවිතා කළ යුත්තේ ඔබ දැනටමත් භාවිතා කරන්නේ නම් පමණි underscore.js. මෙම විසඳුම සමස්ත අවධාරනය කරන පුස්තකාලය එහි deferක්‍රියාකාරිත්වය සඳහා ආනයනය කිරීම වටී නැත . වෙනත් පුස්තකාල මත යැපීමකින් තොරව $timeoutසෑම කෙනෙකුටම දැනටමත් $timeoutකෝණික හරහා ප්‍රවේශ විය හැකි නිසා මම විසඳුමට වැඩි කැමැත්තක් දක්වමි.
ටෙනිස්ජන්ට්

10
ඇත්ත ... නමුත් ඔබ අවධාරනය හෝ ලොඩාෂ් භාවිතා නොකරන්නේ නම් ... ඔබ කරන්නේ කුමක්ද යන්න නැවත ඇගයීමට ලක් කළ යුතුය. එම ලිබ් දෙක කේතයේ පෙනුම වෙනස් කර ඇත.
හිම සහිත

2
රෙස්ටැන්ගුලර් සඳහා යැපීමක් ලෙස අපට ලොඩාෂ් ඇත (අපි ඉක්මනින් එන්ජී-මාර්ගයට වාසිදායක ලෙස රෙස්ටැන්ගුලර් ඉවත් කිරීමට යන්නෙමු). මම හිතන්නේ එය හොඳ පිළිතුරක් නමුත් මිනිසුන්ට අවධාරනය / ලොඩාෂ් භාවිතා කිරීමට අවශ්‍ය යැයි උපකල්පනය කිරීම එතරම් හොඳ නැත. සෑම අතින්ම එම ලිබ්ස් හොඳයි ... ඔබ ඒවා ප්‍රමාණවත් ලෙස භාවිතා කරන්නේ නම් ... මේ දිනවල මම ඊඑස් 5 ක්‍රම භාවිතා කරන අතර එය අවධාරනය කිරීමට මා භාවිතා කළ හේතුවෙන් 98% ක් අතුගා දමයි .
බ්‍රැඩ්ග්‍රීන්ස්

2
ඔබ හරි gSgtPooki. $ කල් ඉකුත්වීම භාවිතා කිරීමේ විකල්පය ඇතුළත් කිරීම සඳහා මම පිළිතුර වෙනස් කළෙමි. out කල් ඉකුත්වීම සහ _.ඩෙෆර් යන දෙකම ඊළඟ සජීවිකරණ ලූපය තෙක් බලා සිටින අතර එමඟින් වත්මන් විෂය පථය සහතික කෙරේ. $ අයදුම් කිරීම අවසන් වී ඇත. මාව අවංකව තබා ගැනීමට ස්තූතියි, සහ පිළිතුර මෙහි යාවත්කාලීන කිරීමට මට අවස්ථාව ලබා දීම.
හිම සහිත

267

මෙහි ඇති බොහෝ පිළිතුරු වල හොඳ උපදෙස් අඩංගු වන අතර ව්‍යාකූලත්වයට ද හේතු විය හැක. සරලව භාවිතා $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 )


4
$timeoutසම්මත කිරීමේදී විවේචනයට ලක් වේ. වළක්වා ගැනීමට තවත් හේතු ඉදිරිපත් කළ $timeoutහැකිද?
mlhDev

89

මෙම ක්‍රියාවලිය වියළි ලෙස තබා ගැනීමට හුරුබුහුටි කුඩා උපකාරක ක්‍රමය:

function safeApply(scope, fn) {
    (scope.$$phase || scope.$root.$$phase) ? fn() : scope.$apply(fn);
}

6
අන් සියල්ලටම වඩා බොහෝ දේ සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීමට ඔබගේ ආරක්ෂිත යෙදුම මට උදව් විය. එය පළ කිරීම ගැන ස්තූතියි.
ජේසන් මෝර්

4
මම එකම දේ කිරීමට සූදානම්ව සිටියෙමි, නමුත් මෙය කිරීමෙන් අදහස් කරන්නේ අප fn () හි සිදුකරන වෙනස්කම් $ ඩයිජෙස්ට් විසින් දැකිය නොහැකි අවස්ථාවක් තිබේද? විෂය පථය උපකල්පනය කරමින් ශ්‍රිතය ප්‍රමාද කිරීම වඩා හොඳ නොවේද? $$ phase === '$ digest'?
ස්පෙන්සර් ඇල්ජර්

මම එකඟ වෙමි, සමහර විට $ apply () ඩයිජෙස්ට් අවුලුවාලීමට භාවිතා කරයි, එෆ්එන් එක තනිවම අමතන්න ... එයින් ගැටලුවක් ඇති නොවේද?
CMCDragonkai

1
මට හැඟෙන්නේ scope.$apply(fn);එසේ විය යුත්තේ scope.$apply(fn());fn () මඟින් ශ්‍රිතය ක්‍රියාත්මක කරන අතර fn නොවන බවයි. කරුණාකර මට වැරදුණු තැනට මට උදව් කරන්න
madhu131313

1
En ZenOut $ අයදුම් කිරීම සඳහා වන ඇමතුම කාර්යයන් ඇතුළුව විවිධ ආකාරයේ තර්ක සඳහා සහය දක්වයි. ශ්‍රිතයක් සමත් වුවහොත් එය ශ්‍රිතය ඇගයීමට ලක් කරයි.
boxmein

33

උදාහරණයක් ලෙස කෝඩ් මිරර් සහ ක්‍රපානෝ වැනි තෙවන පාර්ශවීය ස්ක්‍රිප්ට් වලද මට ඇත්තේ එකම ගැටලුවකි, මෙහි සඳහන් කර ඇති ආරක්ෂිත යෙදුම් ක්‍රම භාවිතා කිරීම පවා මට දෝෂය විසඳා නැත.

නමුත් එය විසඳා ඇත්තේ $ කල් ඉකුත් වීමේ සේවාව භාවිතා කිරීමයි (පළමුව එය එන්නත් කිරීමට අමතක නොකරන්න).

මේ අනුව, වැනි දෙයක්:

$timeout(function() {
  // run my code safely here
})

ඔබේ කේතය තුළ ඔබ භාවිතා කරන්නේ නම්

මෙය

සමහර විට එය කර්මාන්තශාලා නියෝගයක පාලකය තුළ ඇති නිසා හෝ යම් ආකාරයක බැඳීමක් අවශ්‍ය නිසා, ඔබ එවැනි දෙයක් කරනු ඇත:

.factory('myClass', [
  '$timeout',
  function($timeout) {

    var myClass = function() {};

    myClass.prototype.surprise = function() {
      // Do something suprising! :D
    };

    myClass.prototype.beAmazing = function() {
      // Here 'this' referes to the current instance of myClass

      $timeout(angular.bind(this, function() {
          // Run my code safely here and this is not undefined but
          // the same as outside of this anonymous function
          this.surprise();
       }));
    }

    return new myClass();

  }]
)

32

Http://docs.angularjs.org/error/$rootScope:inprog බලන්න

ඔබට ඇමතුමක් ඇති විට ගැටළුව පැන නගින්නේ $applyසමහර විට කෝණික කේතයෙන් පිටත අසමමුහුර්තව ධාවනය වන විට ($ අයදුම් කළ විට) සහ සමහර විට කෝණික කේතය තුළ සමමුහුර්තව ( $digest already in progressදෝෂය ඇති කරයි).

නිදසුනක් ලෙස, ඔබ සතුව පුස්තකාලයක් ඇති විට එය අසමමුහුර්තව සේවාදායකයකින් අයිතම ලබාගෙන ඒවා හැඹිලිගත කරයි. පළමු වරට අයිතමයක් ඉල්ලා සිටින විට, කේත ක්‍රියාත්මක කිරීම අවහිර නොකිරීමට එය අසමමුහුර්තව ලබා ගනී. කෙසේ වෙතත්, දෙවන වරට, අයිතමය දැනටමත් හැඹිලියේ ඇති බැවින් එය සමමුහුර්තව ලබා ගත හැකිය.

මෙම දෝෂය වළක්වා ගත හැකි ක්‍රමය නම් ඇමතුම් කේතය $applyඅසමමුහුර්තව ක්‍රියාත්මක වන බව සහතික කිරීමයි . ඔබගේ කේතය ඇමතුමක සිට $timeoutප්‍රමාදයකින් සකසා ඇති විට මෙය කළ හැකිය 0(එය පෙරනිමිය වේ). කෙසේ වෙතත්, ඔබේ කේතය ඇතුළත $timeoutඇමතීමේ අවශ්‍යතාවය ඉවත් කරයි $apply, මන්ද $ කල් ඉකුත්වීම වෙනත් $digestචක්‍රයක් තනිවම අවුලුවන අතර එමඟින් අවශ්‍ය සියලුම යාවත්කාලීන කිරීම් සිදු කරනු ඇත.

විසඳුමක්

කෙටියෙන් කිවහොත්, මෙය කරනවා වෙනුවට:

... 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, මන්ද එය දළ වශයෙන් එකම දේ කරනු ඇත.


ස්තූතියි, මෙය මගේ නඩුව සඳහා වැඩ කළේ මා මා අමතන්නේ නැති $applyනමුත් තවමත් දෝෂය ඇති වෙමින්.
ariscris

5
ප්‍රධාන වෙනස වන්නේ $applyඑය සමමුහුර්ත වීමයි (එහි ඇමතුම ක්‍රියාත්මක වේ, පසුව අනුගමනය කරන කේතය $ අදාළ වේ) $timeoutඑසේ නොවේ: වත්මන් කේතය පහත සඳහන් කල් ඉකුත්වීම ක්‍රියාත්මක වේ, ඉන්පසු ඔබ භාවිතා කරන ආකාරයටම නව ඇමතුමක් එහි ඇමතුම සමඟ ආරම්භ වේ setTimeout. ඔබ එකම ආකෘතියක් මෙන් දෙවරක් යාවත්කාලීන කරන්නේ නම් එය ග්‍රැෆික් දෝෂ වලට තුඩු දිය හැකිය: $timeoutනැවත යාවත්කාලීන කිරීමට පෙර දර්ශනය ප්‍රබෝධමත් වන තෙක් බලා සිටිනු ඇත.
floribon

ඇත්තෙන්ම ස්තූතියි, ත්‍රෙඩ්. සමහර $ ඔරලෝසු ක්‍රියාකාරකම්වල ප්‍රති as ලයක් ලෙස මා හැඳින්වූ ක්‍රමයක් ඇති අතර, මගේ බාහිර පෙරණය ක්‍රියාත්මක වීමට පෙර UI යාවත්කාලීන කිරීමට උත්සාහ කළෙමි. $ කල් ඉකුත් වූ ශ්‍රිතයක් තුළ එය තැබීම මට ප්‍රයෝජනවත් විය.
djmarquette

28

ඔබ මෙම දෝෂය ලබා ගත් විට, එයින් මූලික වශයෙන් අදහස් වන්නේ එය දැනටමත් ඔබගේ දැක්ම යාවත්කාලීන කිරීමේ ක්‍රියාවලියක යෙදී සිටින බවයි. $apply()ඔබේ පාලකය තුළට ඇමතීමට ඔබට අවශ්‍ය නොවිය යුතුය . ඔබ අපේක්ෂා කළ පරිදි ඔබේ දැක්ම යාවත්කාලීන නොවන්නේ නම්, ඇමතුමෙන් පසු ඔබට මෙම දෝෂය ලැබෙනු ඇත $apply(), එයින් බොහෝ දුරට අදහස් වන්නේ ඔබ ආකෘතිය නිවැරදිව යාවත්කාලීන නොකිරීමයි. ඔබ විශේෂතා කිහිපයක් පළ කළහොත්, අපට මූලික ගැටළුව හඳුනාගත හැකිය.


හෙහ්, මම මුළු දවසම ගත කළේ AngularJS හට “ඉන්ද්‍රජාලිකව” බැඳුම්කර නැරඹිය නොහැකි බවත්, සමහර විට $ apply () සමඟ මම ඔහුව තල්ලු කළ යුතු බවත්ය.
OZ_

කොහෙත්ම අදහස් කරන්නේ you're not updating the the model correctlyකුමක්ද? $scope.err_message = 'err message';නිවැරදි යාවත්කාලීන නොවේ ද?
OZ_

2
ඔබට ඇමතිය යුතු එකම අවස්ථාව $apply()වන්නේ ඔබ කෝණික "පිටත" ආකෘතිය යාවත්කාලීන කරන විට (උදා: jQuery ප්ලගිනයකින්). නිවැරදිව නොපෙනෙන දර්ශනයේ උගුලට වැටීම පහසුය, එබැවින් ඔබ $apply()සෑම තැනකම s පොකුරක් විසි කරයි , එවිට එය OP හි දක්නට ලැබෙන දෝෂය සමඟ අවසන් වේ. මා කියන විට මා you're not updating the the model correctlyඅදහස් කරන්නේ සියලුම ව්‍යාපාරික තර්කනයන් විෂය පථයට අයත් කිසිවක් නිවැරදිව ජනගහනය නොකිරීමයි, එමඟින් දර්ශනය අපේක්ෂා කළ පරිදි නොපෙනේ.
dnc253

එකඟයි, මම පිළිතුර ලිව්වා. මම දැන් දන්නා දේ දැන ගැනීමෙන්, මම $ කල් ඉකුත්වීම (ශ්‍රිතය () {...}) භාවිතා කරමි; එය _.defer කරන ආකාරයටම කරයි. ඔවුන් දෙදෙනාම ඊළඟ සජීවිකරණ පුඩුවට කල් දමයි.
හිම සහිත


11

ඔබට evalAsync ද භාවිතා කළ හැකිය. ඩයිජෙස්ට් අවසන් වූ පසු එය ක්‍රියාත්මක වේ!

scope.evalAsync(function(scope){
    //use the scope...
});

10

පළමුවෙන්ම, මේ ආකාරයෙන් එය නිවැරදි නොකරන්න

if ( ! $scope.$$phase) { 
  $scope.$apply(); 
}

$ අදියර යනු $ ඩයිජෙස්ට් චක්‍රයේ බූලියන් ධජයක් බැවින් එය අර්ථවත් නොවේ, එබැවින් ඔබගේ $ අයදුම් කිරීම () සමහර විට ක්‍රියාත්මක නොවේ. එය නරක පුරුද්දක් බව මතක තබා ගන්න.

ඒ වෙනුවට භාවිතා කරන්න $timeout

    $timeout(function(){ 
  // Any code in here will automatically have an $scope.apply() run afterwards 
$scope.myvar = newValue; 
  // And it just works! 
});

ඔබ යටි ඉරි හෝ ලොඩාෂ් භාවිතා කරන්නේ නම්, ඔබට defer () භාවිතා කළ හැකිය:

_.defer(function(){ 
  $scope.$apply(); 
});

9

සමහර විට ඔබ මේ ආකාරයෙන් භාවිතා කරන්නේ නම් ඔබට තවමත් දෝෂ ලැබෙනු ඇත ( https://stackoverflow.com/a/12859093/801426 ).

මේක උත්සාහ කරන්න:

if(! $rootScope.$root.$$phase) {
...

5
දෙකම භාවිතා කිරීම! $ විෂය පථය. $$ අදියර සහ! $ විෂය පථය. $ root. $$ අවධිය (නොවේ! +1
ඇස්ප්‍රොට්

2
$rootScopeහා anyScope.$rootඑම උළෙහි වේ. $rootScope.$rootඅතිරික්ත වේ.
ෆ්ලොරිබන්


5

භාවිතා කිරීමට උත්සාහ කරන්න

$scope.applyAsync(function() {
    // your code
});

වෙනුවට

if(!$scope.$$phase) {
  //$digest or $apply
}

$ applyAsync පසුකාලීනව සිදුවීමට $ අයදුම් කිරීම උපලේඛනගත කරන්න. එකම ඩයිජස්ට් එකකින් ඇගයීමට ලක් කළ යුතු බහුවිධ ප්‍රකාශන පෝලිම් ගැසීමට මෙය භාවිතා කළ හැකිය.

සටහන: $ ඩයිජෙස්ට් තුළ, $ applyAsync () ගලා යන්නේ වත්මන් විෂය පථය $ rootScope නම් පමණි. මෙයින් අදහස් කරන්නේ ඔබ ළමා විෂය පථයක් මත $ ඩයිජෙස්ට් ලෙස හැඳින්වුවහොත්, එය $ applyAsync () පෝලිම ව්‍යංගයෙන් ගලා නොයන බවයි.

උදාහරණය:

  $scope.$applyAsync(function () {
                if (!authService.authenticated) {
                    return;
                }

                if (vm.file !== null) {
                    loadService.setState(SignWizardStates.SIGN);
                } else {
                    loadService.setState(SignWizardStates.UPLOAD_FILE);
                }
            });

යොමුව:

1. විෂය පථය. $ AppAAsync () එදිරිව විෂය පථය Ang AngularJS 1.3 හි evalAsync ()

  1. AngularJs Docs

4

ජීර්ණ චක්‍රයක් අවුලුවනවාට වඩා අභිරුචි සිදුවීමක් භාවිතා කිරීමට මම ඔබට උපදෙස් දෙමි.

අභිරුචි සිදුවීම් විකාශනය කිරීම සහ මෙම සිදුවීම් සඳහා සවන්දෙන්නන් ලියාපදිංචි කිරීම ඔබ ජීර්ණ චක්‍රයක සිටියත් නැතත් සිදුවීමට බලාපොරොත්තු වන ක්‍රියාවක් ආරම්භ කිරීමට හොඳ විසඳුමක් බව මම සොයා ගතිමි.

අභිරුචි සිදුවීමක් නිර්මාණය කිරීමෙන් ඔබ ඔබේ කේතය සමඟ වඩාත් කාර්යක්ෂම වන්නේ ඔබ එම සිදුවීමට දායක වූ සවන්දෙන්නන් පමණක් පොළඹවන නිසාත්, ඔබ විෂය පථයට ආරාධනා කළහොත් විෂය පථයට බැඳී ඇති සියලුම ඔරලෝසු අවුලුවන නිසාත් නොවේ.

$scope.$on('customEventName', function (optionalCustomEventArguments) {
   //TODO: Respond to event
});


$scope.$broadcast('customEventName', optionalCustomEventArguments);

3

නැවත භාවිතා කළ හැකි $ ආරක්ෂිත යෙදුම් ශ්‍රිතයක් නිර්මාණය කිරීමේදී යෙර්ෆ්මූ විශාල කාර්යයක් ඉටු කළේය:

https://github.com/yearofmoo/AngularJS-Scope.SafeApply

භාවිතය :

//use by itself
$scope.$safeApply();

//tell it which scope to update
$scope.$safeApply($scope);
$scope.$safeApply($anotherScope);

//pass in an update function that gets called when the digest is going on...
$scope.$safeApply(function() {

});

//pass in both a scope and a function
$scope.$safeApply($anotherScope,function() {

});

//call it on the rootScope
$rootScope.$safeApply();
$rootScope.$safeApply($rootScope);
$rootScope.$safeApply($scope);
$rootScope.$safeApply($scope, fn);
$rootScope.$safeApply(fn);

2

ශ්‍රිතය ක්‍රියාත්මක වන බව මා දන්නා ස්ථාන $evalවෙනුවට ඇමතීමෙන් මෙම ගැටළුව විසඳීමට මට හැකි විය .$apply$digest

අනුව ලේඛන , $applyමූලික වශයෙන් මෙම කරන්නේ:

function $apply(expr) {
  try {
    return $eval(expr);
  } catch (e) {
    $exceptionHandler(e);
  } finally {
    $root.$digest();
  }
}

මගේ නඩුවේදී, ng-clickවිචල්‍යයක් විෂය පථයක් තුළ විචල්‍යයක් වෙනස් කරන අතර, එම විචල්‍යය පිළිබඳ $ ඔරලෝසුව වෙනත් විචල්‍යයන් වෙනස් කළ යුතුය $applied. මෙම අවසාන පියවර "දැනටමත් ජීර්ණය වෙමින් පවතී" දෝෂය ඇති කරයි.

ඔරලෝසු ප්‍රකාශනය ඇතුළත ප්‍රතිස්ථාපනය $applyකිරීමෙන් $evalවිෂය පථ විචල්‍යයන් අපේක්ෂිත පරිදි යාවත්කාලීන වේ.

එම නිසා, කෝණික තුළ වෙනත් වෙනසක් නිසා ඩයිජෙස්ට් කෙසේ හෝ ක්‍රියාත්මක වන බව පෙනේ නම්, $evalඔබ කළ යුත්තේ එපමණකි.



1

කෝණික ලේඛන පරීක්ෂා අමතන්න බව තේරුම් $$phaseයනු ප්රති-රටාව , මම ලබා ගැනීමට උත්සාහ $timeoutහා _.deferවැඩ කිරීමට.

කල් ඉකුත්වීම සහ කල් දැමූ ක්‍රම මඟින් {{myVar}}ඩොම් තුළ ෆවුට් වැනි විග්‍රහ නොකළ අන්තර්ගතයන් සැණෙකින් නිර්මාණය වේ. මට මෙය පිළිගත නොහැකි විය. යම් දෙයක් අනවසරයෙන් සිදුවන බවත්, සුදුසු විකල්පයක් නොමැති බවත්, එය බොහෝ දේ නොකියයි.

සෑම අවස්ථාවකම ක්‍රියාත්මක වන එකම දෙය නම්:

if(scope.$$phase !== '$digest'){ scope.$digest() }.

මෙම ක්‍රමයේ අන්තරාය මට තේරෙන්නේ නැත, නැතහොත් එය අදහස් දැක්වීමේ සහ කෝණික කණ්ඩායමේ පුද්ගලයින් විසින් හැක් කිරීමක් ලෙස විස්තර කරන්නේ ඇයි. විධානය නිවැරදි හා කියවීමට පහසු බව පෙනේ:

"එකක් දැනටමත් සිදුවන්නේ නැත්නම් ඩයිජෙස්ට් කරන්න"

කෝපි ස්ක්‍රිප්ට්හි එය ඊටත් වඩා ලස්සනයි:

scope.$digest() unless scope.$$phase is '$digest'

මෙහි ඇති ගැටලුව කුමක්ද? FOUT එකක් නිර්මාණය නොකරන විකල්පයක් තිබේද? $ ආරක්ෂිත යෙදුම හොඳ පෙනුමක් ඇති නමුත් $$phaseපරීක්ෂණ ක්‍රමයද භාවිතා කරයි .


1
මෙම ප්‍රශ්නයට දැනුවත් ප්‍රතිචාරයක් දැකීමට මා කැමතිය!
බෙන් වීලර්

එය අනවසරයෙන් මඟ හැරීම හෝ කේතය මේ මොහොතේ තේරුම් නොගැනීම නිසා එය අනවසරයකි: එක්කෝ ඔබ කෝණික ඩයිජෙස්ට් චක්‍රය තුළ සිටින අතර ඔබට එය අවශ්‍ය නොවේ, නැතහොත් ඔබ ඉන් පිටත අසමමුහුර්තව සිටින අතර පසුව ඔබට එය අවශ්‍ය වේ. කේතයේ එම අවස්ථාවේදී ඔබට එය දැනගත නොහැකි නම්, එය ජීර්ණය කිරීමට ඔබ වගකිව යුතු නොවේ
floribon

1

මෙය මගේ උපයෝගීතා සේවාවයි:

angular.module('myApp', []).service('Utils', function Utils($timeout) {
    var Super = this;

    this.doWhenReady = function(scope, callback, args) {
        if(!scope.$$phase) {
            if (args instanceof Array)
                callback.apply(scope, Array.prototype.slice.call(args))
            else
                callback();
        }
        else {
            $timeout(function() {
                Super.doWhenReady(scope, callback, args);
            }, 250);
        }
    };
});

එය භාවිතා කිරීම සඳහා මෙය උදාහරණයකි:

angular.module('myApp').controller('MyCtrl', function ($scope, Utils) {
    $scope.foo = function() {
        // some code here . . .
    };

    Utils.doWhenReady($scope, $scope.foo);

    $scope.fooWithParams = function(p1, p2) {
        // some code here . . .
    };

    Utils.doWhenReady($scope, $scope.fooWithParams, ['value1', 'value2']);
};

1

මම මෙම ක්‍රමය භාවිතා කර ඇති අතර එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ. මෙය චක්‍රය අවසන් වී පසුව අවුලුවන කාලය එනතෙක් බලා සිටී apply(). apply(<your scope>)ඔබට අවශ්‍ය ඕනෑම තැනක සිට ශ්‍රිතය අමතන්න .

function apply(scope) {
  if (!scope.$$phase && !scope.$root.$$phase) {
    scope.$apply();
    console.log("Scope Apply Done !!");
  } 
  else {
    console.log("Scheduling Apply after 200ms digest cycle already in progress");
    setTimeout(function() {
        apply(scope)
    }, 200);
  }
}

1

මම නිදොස්කරණය අක්‍රීය කළ විට, දෝෂය තවදුරටත් සිදු නොවේ. මගේ නඩුවේදී , එය නිදොස්කරණය කරන්නා කේත ක්‍රියාත්මක කිරීම නැවැත්වීම නිසාය.


0

ඉහත පිළිතුරු වලට සමාන නමුත් මෙය මට විශ්වාසවන්තව වැඩ කර ඇත ... සේවාවක් තුළ:

    //sometimes you need to refresh scope, use this to prevent conflict
    this.applyAsNeeded = function (scope) {
        if (!scope.$$phase) {
            scope.$apply();
        }
    };

0

ඔයාට පාවිච්චි කරන්න පුළුවන්

$timeout

දෝෂය වැළැක්වීමට.

 $timeout(function () {
                        var scope = angular.element($("#myController")).scope();
                        scope.myMethod();
                        scope.$scope();
                    },1);

මට $ කල් ඉකුත්වීම භාවිතා කිරීමට අවශ්‍ය නැතිනම් කුමක් කළ යුතුද
rahim.nagori

0

ගැටළුව මූලික වශයෙන් පැමිණෙන්නේ, ඩයිජෙස්ට් චක්‍රය ක්‍රියාත්මක කිරීම සඳහා අපි කෝණික ලෙස ඉල්ලා සිටින අතර, එහි ක්‍රියාවලිය තුළ වුවද අවබෝධය සඳහා කෝණික ලෙස ගැටළුවක් නිර්මාණය වේ. විපාක විධාන කොන්සෝලය තුළ.
1. විෂය පථය ඇමතීමට කිසිදු තේරුමක් නැත.
2. මෙම කේතය එහි දේශීය කෝණික නොවන කෝණික එනම් setTimeout අර්ථ නිසා වැනිලා JavaScript ක්රියාකාරිත්වයට යයි
3. ඔබ භාවිතා කල හැකි බව සිදු කිරීම සඳහා

(!. විෂය පථය $$ අදියර) {නම්
. විෂය පථය $ evalAsync (කාර්යය () {

}); }


0
        let $timeoutPromise = null;
        $timeout.cancel($timeoutPromise);
        $timeoutPromise = $timeout(() => {
            $scope.$digest();
        }, 0, false);

මෙම දෝෂය වළක්වා ගැනීමට සහ අයදුම් කිරීමෙන් වැළකී සිටීමට හොඳ විසඳුමක් මෙන්න

බාහිර සිදුවීමක් මත පදනම්ව ඇමතුමක් ලබා දෙන්නේ නම්, ඔබට මෙය නිශ්කාෂණය (0) සමඟ ඒකාබද්ධ කළ හැකිය. ඉහත දැක්වෙන්නේ අප භාවිතා කරන 'නිදොස් කිරීම' සහ කේතයේ සම්පූර්ණ උදාහරණයයි

.factory('debounce', [
    '$timeout',
    function ($timeout) {

        return function (func, wait, apply) {
            // apply default is true for $timeout
            if (apply !== false) {
                apply = true;
            }

            var promise;
            return function () {
                var cntx = this,
                    args = arguments;
                $timeout.cancel(promise);
                promise = $timeout(function () {
                    return func.apply(cntx, args);
                }, wait, apply);
                return promise;
            };
        };
    }
])

යම් සිදුවීමකට සවන් දීමට සහ ඔබට අවශ්‍ය විෂය පථයෙන් $ ඩයිජෙස්ට් අමතන්න

        let $timeoutPromise = null;
        let $update = debounce(function () {
            $timeout.cancel($timeoutPromise);
            $timeoutPromise = $timeout(() => {
                $scope.$digest();
            }, 0, false);
        }, 0, false);

        let $unwatchModelChanges = $scope.$root.$on('updatePropertiesInspector', function () {
            $update();
        });


        $scope.$on('$destroy', () => {
            $timeout.cancel($update);
            $timeout.cancel($timeoutPromise);
            $unwatchModelChanges();
        });

-3

මෙය හමු විය: https://coderwall.com/p/ngisma එහිදී නේතන් වෝකර් (පිටුවේ පහළින්) විනෝදජනක 'සේෆ් ඇප්ලයි' නිර්මාණය කිරීම සඳහා $ rootScope හි සැරසිලි කරුවෙකු යෝජනා කරයි, කේතය:

yourAwesomeModule.config([
  '$provide', function($provide) {
    return $provide.decorator('$rootScope', [
      '$delegate', function($delegate) {
        $delegate.safeApply = function(fn) {
          var phase = $delegate.$$phase;
          if (phase === "$apply" || phase === "$digest") {
            if (fn && typeof fn === 'function') {
              fn();
            }
          } else {
            $delegate.$apply(fn);
          }
        };
        return $delegate;
      }
    ]);
  }
]);

-7

මෙය ඔබගේ ගැටළුව විසඳනු ඇත:

if(!$scope.$$phase) {
  //TODO
}

(! Ope විෂය පථය. $$ අදියර) $ විෂය පථය. $ අයදුම් කරන්න (), එයින් අදහස් වන්නේ ඔබේ $ විෂය පථය. $ අයදුම් කරන්න () ඇමතුම් තොගයේ ප්‍රමාණවත් නොවේ නම්.
MGot90
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.