2015-02-03 1 views
2

요소에 대한 클릭을 가로 채고 어딘가에 $ location 서비스를 사용하는 지시문이있는 간단한 예제를 보겠습니다. $ scope.path() 호출을 $ scope로 감쌀 필요가있는 이유는 무엇입니까? $ apply?

는 HTML :

<a my-href="/">Click me</a> 

는 스크립트 :

angular.module('app').directive('myHref', function(){ 
     return { 
      controller: function($scope, $location){ 
       $scope.navigate = function(path){ 
        $scope.$apply(function(){ 
         $location.path(path); 
        }); 
       }; 

      }, 
      link: function(scope, elem, attrs){ 
       elem.bind('click', function(){ 
        scope.navigate(attrs.myHref); 
       }); 
      } 
     } 
    }); 

는 바이올린 : 각 $location 서비스를 사용하여 위치를 업데이트하는 업데이트 할 일이 다이제스트 사이클이 필요하기 때문에 http://jsfiddle.net/basslagter/4mya2uv0/

답변

3

당신은 일반적으로 필요하지 않습니다 위치. 귀하의 경우에는 앵글 컨텍스트 외부에있는 수동으로 바인딩 된 클릭 이벤트 (ng-click 사용과 반대)에서 스코프 기능을 호출하기 때문에 각도 이벤트가 발생했는지 여부를 알 수없고 범위를 업데이트했습니다. . scope.apply을 사용할 때 호출 스택 (즉, 원점)의 맨 위에 배치해야하기 때문에 잘못된 위치에 배치해야합니다. 그렇지 않으면 각도 컨텍스트 내에서 호출 할 때 범위 기능을 사용할 수 없게됩니다. 또한 컨트롤러 내에서 수동으로 다이제스트주기를 수행하는 경우 때때로 이상한 일이 있습니다. 예를 들어

:

angular.module('app').directive('myHref', function(){ 
    return { 
     controller: function($scope, $location){ 
      $scope.navigate = function(path){ 
       $location.path(path); 
      }; 

     }, 
     link: function(scope, elem, attrs){ 
      elem.bind('click', function(){ 
       scope.navigate(attrs.myHref); 
       scope.$apply(); //<-- Here 
      }); 
     } 
    } 
}); 
관련 문제