web-dev-qa-db-fra.com

Angularjs [$ rootScope: inprog] erreur inprogress

Je reçois une erreur angularjs [$ rootScope: inprog].

Error: [$rootScope:inprog] http://errors.angularjs.org/1.2.7/$rootScope/inprog?p0=%24digest.

c'est la fonction qui appelle

 Members.get({}, function (response) { // success
   $scope.family_mem = response.data;    
  }, function (error) { // ajax loading error

    Data.errorMsg(); // display error notification
  });

dans la console, j'obtiens des résultats par la fonction du contrôleur php. mais ne met pas à jour $scope.family_mem va plutôt à la partie erreur. c'est la directive

myApp.directive('mySelect', function() {
  return{
    restrict: 'A',
    link: function(scope, element){
      $(element).select2();
    }
  };
});
19
Nisham Mahsin

Habituellement, cela signifie que vous avez défini $ rootScope. $ Appliquer manuellement quelque part à l'intérieur d'un autre code angular qui a déjà un cycle de vie. Cela ne devrait pas se produire dans les cas courants car angular suit le cycle de vie lui-même. Le seul cas courant où cela est nécessaire est lorsque vous devez mettre à jour la portée à partir de code non angulaire (comme jquery ou des choses js à l'ancienne). Veuillez donc vérifier si vous l'avez quelque part. Dans le cas où vous en avez vraiment besoin, il est préférable d'utiliser Safe Apply (l'extrait de code commun):

angular.module('main', []).service('scopeService', function() {
     return {
         safeApply: function ($scope, fn) {
             var phase = $scope.$root.$$phase;
             if (phase == '$apply' || phase == '$digest') {
                 if (fn && typeof fn === 'function') {
                     fn();
                 }
             } else {
                 $scope.$apply(fn);
             }
         },
     };
});

Ensuite, vous pouvez injecter ce service et effectuer les appels nécessaires en:

scopeService.safeApply($rootScope, function() {
    // you code here to apply the changes to the scope
});
32

[$ rootScope: inprog] erreur inprogress dans mon cas:
Cas 1: Cela signifie que vous exécutez deux actions à la fois.

Exemple:

goView();
hidePopOver(); //Will trigger error

Utilisez $ timeout pour vous assurer que deux actions (fonction) ne s'exécutent pas en même temps.

goView();
$timeout(function () {
    hidePopOver();
}, 300);

Cas 2: une action ne s'est pas exécutée complètement.
Utilisez $ timeout pour vous assurer que la première action a été exécutée.

$timeout(function () {
    $(element.target).trigger('click');
}, 300);
5
Serip88