2014-04-17 15 views
6

Ich versuche einige Texte auf einer Seite zu aktualisieren, die Teil von $ scope ist. Aber ich erhalte immer diese Fehlermeldung:

Error: [$rootScope:inprog] [http://errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24apply][1] 
at Error (native) 
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:6:450 
at m (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:101:443) 
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:301) 
at h.$scope.changeLang (http://treenovum.es/xlsmedical/js/medical-app.js:80:16) 
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:169:382 
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:186:390 
at h.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:40) 
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:318) 
at HTMLAnchorElement.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:186:372) 

Offensichtlich etwas mache ich falsch. :) Irgendwelche Ideen, wie ich das beheben kann? Ich möchte, dass die Seite auf die neuen Variablen im Bereich aktualisiert wird.

Dies ist der Code, den ich für die Aktualisierung bin mit:

medicalApp.controller('MainCtrl', function($scope, $cookies, getTranslation) { 
    getTranslation.get(function(data){ 
     $scope.translation = data; 
    }); 

    $scope.changeLang = function (lang) { 
     console.log(lang); 
     $cookies.lang = lang; 
     $scope.$apply(function(){ 
      getTranslation.get(function(data){ 
       $scope.translation = data; 
       console.log(JSON.stringify($scope.translation)); 
      }); 
     }); 
    }; 
}); 

die html:

<body ng-controller="MainCtrl"> 
    ... 
      <div class="header-lang col-xs-4"> 
       <p> 
        <a href="#" ng-click="changeLang('de')">DE</a> | 
        <a href="#" ng-click="changeLang('fr')">FR</a></p> 
      <div>{{ translation.text }}</div> <---- Example variable I want updated. 
    ... 

ich bin, auch ngRoute mit separaten Steuerungen für jede Seite, die ich laden zu verwenden, wenn das hat irgendetwas damit zu tun?

Antwort

8

Sie verwenden $scope.$apply(...) innerhalb der Funktion changeLang, so dass Sie den allgemeinen 'bereits in einem Digest' Fehler erhalten. Sie müssen den Aufruf nicht auf getTranslation innerhalb eines $ scope setzen. $ Apply (...) Block, weil bereits erledigt ist. Yank das aus und es sollte einfach funktionieren. Außerdem würde ich empfehlen, mit einer nicht-verkleinerten Version von angular for dev zu laufen, damit Sie bessere Fehler in Ihrer Konsole sehen können.

+0

Ich bin nicht sicher, ob Ihre Lösung funktioniert oder nicht, aber ich erkannte, dass das Problem etwas anderes ist. getTranslation ist eine Factory, die aufgerufen wird, wenn die Seite geladen wird, aber wenn ich sie ein zweites Mal aufrufe, wird sie ignoriert. Wissen Sie, wie Sie das lösen können? –

+0

Ich muss den getTranslation-Code sehen, aber es hört sich so an, als ob Sie sich mit der 'Singleton'-Lebensdauer eines Dienstes beschäftigen. Denken Sie daran, dass eckig Singleton-Instanzen aus seinem Dependency-Injection-Container ausgibt. – SonOfNun

16

Wenn sich Ihre Vorlage nach dem Ändern der Modelle nicht ändert und Sie $scope.$apply verwenden müssen, können Sie statt dessen $scope.$applyAsync verwenden.

https://github.com/angular-ui/ui-codemirror/issues/73

+0

Das löst mein Problem. Danke vielmals !! –

+0

Wunderbar! Dies löste ein Problem, das ich hatte, sehr verpflichtet! –

Verwandte Themen