2014-09-22 7 views
1

module.run에서 $ rootScope assingnment를 실행하는 동안 문제가 있습니다.

모듈의 실행에있다 : 다음

app.run(['$rootScope', 'UserData', function($rootScope, UserData) { 
    "use strict"; 
    UserData.data().success(function(data) { 
     $rootScope.session = data; 
    }); 
}]); 

모든 제어기 초기 사용한 경우 :

$scope.user = $rootScope.session; 

는 정의되지 않는다. 나중에 사용되는 경우 필수 데이터가 들어 있습니다.

컨트롤러가 초기화 된 후 UserData.data의 콜백이 호출 될 수 있으므로 경쟁 조건이있는 것 같습니다.

컨트롤러의 $ scope.user에서 $ scope 및 $ timeout ($ scope. $ apply는 여기에 의미가 없습니다 ..) 시도했지만 아무런 효과가 없습니다. 나는 $ 범위를 넣어하려고합니다. $ app.run 적용

그것은 defauly에 의해 서비스에 사용 된 $ HTTP로, 이미 진행 분명 사실이다

에서 다이제스트 나에게

을 gaves $ apply를 호출합니다.

내가 뭘 잘못하고 있니?

각도 앱의 모든 컨트롤러에 데이터를 제공하려면 어떻게해야합니까? $ rootScope는 내가 원하는 것처럼 작동하지 않거나, 잘못된 것을하고 있습니까? 템플릿/컨트롤러에서 데이터를 업데이트 할 수있는 방법이 없으므로 app.run의 콜백이 -data로 채워질 때 채워집니다.

도움 주셔서 감사합니다.

추신 : 내가 console.log ($ rootScope) 할 때 나는 적절한 데이터를 가진 세션 객체를 가지고 있지만, 내가 console.log ($ rootScope.session)를 시도 할 때 undefined를 본다. .

편집 : 내가 발견, 그 실행 $ rootScope $ 시계는 문제 해결,하지만 지금까지 DRY되는 - rootScope를 사용하는 모든 범위 변수에 시계를 넣어.

답변

0

당신은 용기의 일종으로 개체를 포장해야합니다. 예 :

$rootScope.cont = { session: mySession }; 

더 좋은 아이디어는 세션을 $rootScope에 전혀 넣지 않는 것입니다. 사용자 서비스 내의 상태 객체에이 객체를 유지하고 컨트롤러가 해당 서비스를 주입하고 세션을 가져올 수 있습니다.

이 글을 읽는다면 : http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html 내 생각에 도움이 될 것입니다.

그래서 기본적으로 당신이 $rootScope을 고수하려는 경우, 당신과 같이 컨트롤러에 세션에 바인딩해야한다 : 당신이보기에서 세션 객체를 사용할 때마다

$scope.cont = $rootScope.cont; 

그렇다면, 당신은 할 필요가 먼저 참조부터 시작하십시오.또한 <div>{{cont.session.username}}</div>


하나 console.log 다른 쇼가 정의되지 않은 상태에서 디버거 (크롬 이상)시에있는 객체 볼 것이다 콘솔에서 확장 때문이다 올바른 정보를 보여줍니다 이유. 단순히 값을 너무 일찍 인쇄하면 undefined이됩니다.

+0

오! 크롬은 나를 많이 혼란스럽게했다. 나는 그것을 몰랐다. ~보다! 나는 두 가지 해결책을 시도 할 것이다. – Jarema

+0

btw 컨트롤러에 $ watch가없는 컨테이너에 넣으면 빈 객체 만 제공됩니다. $ watch가 여전히 필요합니다. 나는 중첩 된 범위가 작동하는 방법을 알고있다. (나는 추측한다. :)). 문제는 app.run과 컨트롤러에서 실행 된 rootScope 사이의 데이터 바인딩이 있지만 문제가 아니라는 것입니다. – Jarema

+0

내 생각 엔 여전히 세션에 직접 바인딩하려고합니다. 당신은 확실히'$ watch'가 필요 없기 때문에 제 대답을 업데이트했습니다. –