2014-03-29 5 views
24

현재 로그인 된 사용자 권한 수준을 저장하는 데 사용하는 다음 $ rootScope 변수가 있으며 다른 컨트롤러에서이 변수에 액세스합니다. 루트 스코프 변수를 변경하여 특정 변수를 컨트롤러에 업데이트하기 위해 변경 사항에 대한 rootScope 변수를 볼 수있는 방법이 있습니까? 아래 코드는 제가 지금까지 사용하고있는 코드입니다. 누군가 제가 제멋대로하고있는 것을 말해 주시겠습니까? .RUN 아래 app.js 감사

: $watch

$scope.$watch($rootScope.uPLevel, function() { 
      $scope.userPLevel = $rootScope.uPLevel; 
    }, true); 

답변

48

첫번째 파라미터

$rootScope.uPLevel = 0; 

.controller 문자열 또는 함수 (docs)이어야 하나. 지금 컨트롤러의 초기화에서 $rootScope.uPLevel의 값을 전달 중입니다.

$scope.$watch(function() { 
    return $rootScope.uPLevel; 
}, function() { 
    $scope.userPLevel = $rootScope.uPLevel; 
}, true); 

두 sidenotes는 :

  • $rootScope 대신 서비스에서이 값을 저장하기 위해 신중한 수 있습니다.
  • uPLevel이 정수일 경우 (예제에서와 같이) true을 세 번째 매개 변수로 전달할 필요가 없습니다. 이는 배열 및 객체에만 해당됩니다. 컬렉션을보고 싶다면 대신 $watchCollection을 사용하는 것이 좋습니다.
+0

고마워요. 모든 서비스/컨트롤러 응용 프로그램에서 액세스 할 수있는 방법이 필요하기 때문에 rootscope에서 사용하고 있습니다. 서비스 내에서이 변수를 사용하는 것이 훨씬 더 좋다고 생각하십니까? 그렇다면 이유를 설명해주십시오. – MChan

+0

@MChan 일반적으로'window'에 많은 변수를 붙이지 않는 것과 같은 이유로'$ rootScope'를 어지럽히는 것은 나쁜 생각입니다. 생각할 게있어. upvote하는 것을 잊지 마세요! – SomeKittens

+3

@ SomeKittensUx2666은 $ rootScope에 물건을 올려 놓는 것을 막아야한다는 것이 맞습니다.이 경우에는 모든 컨트롤러/서비스가 변경 논리를 처리하기 위해들을 수있는 $ rootScope의 이벤트를 브로드 캐스트하는 것이 좋습니다. – Brocco

21

내가 그렇게보고 $의 rootScope 변수를 권장합니다

$scope.$watch('$root.uPLevel', function() { 
    $scope.userPLevel = $rootScope.uPLevel; 
}); 

이러한 방식으로, 현재 지침/컨트롤러가 파괴됩니다. 시계도 지 웁니다. $ rootScope. $ 시계 케이스에서는 시계가 영원히 유지됩니다.

+0

매력처럼 작동 – Jan

+0

좋은 아이디어. 성능 최적화를 찾고 있다면 완벽하십시오 – msaad

+0

고맙습니다. 그냥 작동합니다. – Godekere

관련 문제