2013-01-07 5 views
3

이상한 문제, CtrlA에 설정된 CtrlB 변수의 $ rootScope에 액세스 할 수 없습니다.AngularJS - RootScope에 액세스 할 수 없습니다.

HTML :

<div role="main" class="container_9" ng-controller="CountryCtrl" ng-init="updateToken('<?php echo $TOKEN; ?>')"> 

CtrlA

app.controller('CountryCtrl', function ($scope,$rootScope, $http) { 
    $scope.updateToken = function(token) { 
     $rootScope.token = token; 
    } 
}); 

CtrlB

app.controller('DealerListCtrl', function ($scope, $http, $rootScope, dealerService) { 
    $scope.dealer = []; 
    $http.get('files/framework/dealer/'+ $rootScope.token).success(function(data) { 
     $scope.dealerall = data; 
    }); 
    //$scope.dealerall = dealerService.api.get({token: $scope.token}); 
    $scope.orderProp = 'name'; 

}); 

오류 메시지 :

/framework/dealer/undefined 500 (Internal Server Error) 

내가 뭘 잘못하고 있니?

UPDATE
Plunker 코드 : 그것은 실행할 수있는이 아니다
http://plnkr.co/edit/r559zyMKjA64xSdmrTem

...

+0

Plunker가 상당히 길다. 당신이 쉽게 놀 수 있도록 그것을 단순화 할 수 있습니까? –

답변

0

그것은 $rootScope 잘 접근입니다. 그렇지 않다면 정의되지 않은 $ rootScope에 대한 javascript 오류가 발생했을 것입니다. 대신 요청 URL의 끝에 "정의되지 않음"이 붙습니다. 즉 $rootScope.token은 정의되지 않습니다. $rootScope.token이 정의되었는지 확인하십시오.

CtrlB 전에 CtrlB가 호출 된 것으로 의심되어 $rootScope.token이 아직 설정되지 않았습니다.

2

여기에는 두 가지 중요한 문제가 있습니다. 첫째, 서비스를 사용해야 할 때 $ rootScope를 사용하고 두 번째로 컨트롤러의 실행 순서를 가정합니다. 두 번째 컨트롤러의 경우, $ watch 명령을 설정하여 변경 사항을 모니터링하여 두 번째 컨트롤러가 업데이트 된 값을 갖도록 설정할 수 있습니다.

하지만 글로벌 범위를 오염시키지 않아야합니다. 주입 할 수있는 서비스에 토큰을 감싸고 변경 사항을 볼 수 있습니다. 즉 컨트롤러가 어떤 컨텍스트에서 실행되는지 알지 못해서 더 구체적인 (즉 코드) 게시 할 수 없습니다.

하지만 도움이 되었기를 바랍니다. 원하는 경우 게시물을 더 많은 정보로 업데이트하면 좀 더 깊이 잠수 할 것입니다. 실제로 직접 수정할 수있는 Plunker 또는 jsFiddle을 만들 수 있다면 좋을 것입니다.

+0

안녕하세요, 감사합니다. 내 첫 번째 게시물에서 업데이 트를 참조하십시오. 나는 AngularJS에 처음 온 사람입니다. 어쩌면 내 app.js를 최적화 할 가능성이 있습니다. – Marek123

관련 문제