AngularJS를 사용하다가 보면 어떤 경우에는 $scope.$apply 함수를 사용해주어야 위의 로직에서 변경한 변수들이 제대로 적용되는것을 볼 수 있습니다. 어떤 경우에 $apply함수가 자동으로 동작하지 않고 어떤 경우에 자동으로 동작하는지는 아직 파악이 되지 않지만 보통 directive에서 상속받은 scope의 변수들을 변경했을 경우 $apply 함수가 자동으로 동작하지 않는 것을 자주 봐왔습니다. 그런데 어느 날 directive를 구현하는데 어떤 경우에는 $apply 가 이미 동작중이라는 오류 메시지가 보이는 것 ($apply already in progress). 찾아보니 이 문제를 해결할 수 있는 방법이 있었습니다.
해결방법
if ($scope.$$phase !== '$apply' && $scope.$$phase !== '$digest') {
$scope.$apply(function() {
...
});
}
위와같이 $$phase라는 변수를 가져와서 조건을 걸어주면 됩니다. $$phase 변수는 $apply나 $digest가 실행중인지 여부를 담고 있는 것 같습니다.