$ rootScope에 도달 할 수 없습니다


162

다음 파일 "작동"(오류가 발생하지 않는다는 의미) :

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script> 
    <script>
        angular.module("modx", [], function($routeProvider) {
        });
    </script>
</html>

하지만 이것은

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script>
    <script>
        angular.module("modx", [], function($routeProvider, $rootScope) {
        });
    </script>
</html>

오류가 발생합니다.

오류 : 알 수없는 공급자 : modx에서 $ rootScope
소스 파일 : http://code.angularjs.org/angular-1.0.0rc7.js
줄 : 2491

WTF?


114
결론으로 WTF의 경우 +1입니다.
Eliran Malka

답변:


307

구성 단계에서는 예를 들어 요청할 수 없습니다. 제공자 만 요청할 수 있습니다.

var app = angular.module('modx', []);

// configure stuff
app.config(function($routeProvider, $locationProvider) {
  // you can inject any provider here
});

// run blocks
app.run(function($rootScope) {
  // you can inject any instance here
});

자세한 내용은 http://docs.angularjs.org/guide/module 을 참조 하십시오 .


9
고마워, 완벽하게 이해가 되긴하지만 어떻게 알았어? 문서에 있었습니까?
Malvolio

143
@Mavolio 아니요, 그는 3 명의 핵심 개발자 중 한 명입니다.
ChrisOdney 2016

8
FWIW, 그것은 지금 문서의 "Module Loading & Dependencies"섹션에 있습니다.
Mark Rajcok

1
@vojta 그러나 외부에서 매개 변수를 전달하고 사용하려면 config어떻게해야합니까? asp.net 앱 내에서 루트 경로를 말합니까? 전역 변수를 사용하고 싶지 않고에 값 을 사용 ng-init='root:<%= myroot %>'하고 싶었 root습니다 module.config.
vittore

7
@vittore이 "외부"구성을 전역 창에 넣는 것이 좋습니다. 또는이 모든 것을 정의하는 하나의 모듈을 가지고 응용 프로그램에로드하십시오 (예 : angular.module('config', []).constant('appRoot', '/local/js/app');(이 코드는 서버에 의해 생성 될 것입니다 (html 파일에 인라인하지 않고 JS 파일로 생성 할 수도 있습니다). 그러면 앱이이 모듈을로드하여에 액세스 할 수 appRoot있습니다.
Vojta

7

다음 "패턴"이 매우 유용하다는 것을 알았습니다.

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];
function MainCtrl (scope, rootscope, location, thesocket, ...) {

여기서 MainCtrl은 컨트롤러입니다. 이름을 변경하고 문제를 일으킬지도 모른다는 두려움에 대해 인스턴스의 일대일 모방을 수행하는 Controller 함수의 매개 변수 이름에 의존하는 것이 불편합니다. 이 목적으로 $ inject를 명시 적으로 사용하는 것이 좋습니다.


그거 멋지다; 하지만 어떻게 그렇게 접근 MainCtrl합니까?
f1lt3r

귀하의 의견은 오래되었지만 미래를위한 질문에 답변 할 가치가 있음을 알고 있습니다. 모듈 / 컨트롤러는 다음과 같이 정의 할 수 있으므로 다음과 같이 액세스 할 수 있습니다.angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

나는 당신이했던 것처럼 구문을 사용 하지 않는 것이 좋습니다 . AngularJS와 당신이 원하는대로 다양한 기능을 가지고 있습니다 ( run, config, service, factory, 등),있는 더 professional.In이 기능 당신도 주입하지 않아도 스스로 같은

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];

아시다시피 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.