angularjs를 사용하여 샘플 애플리케이션을 작성 중입니다. 크롬 브라우저에서 아래에 언급 된 오류가 발생했습니다.
오류는
오류 : [ng : areq] http://errors.angularjs.org/1.3.0-beta.17/ng/areq?p0=ContactController&p1=not%20a%20function%2C%20got%20undefined
다음과 같이 렌더링되는
인수 ‘ContactController’는 함수가 아니므로 정의되지 않았습니다.
암호
<!DOCTYPE html>
<html ng-app>
<head>
<script src="../angular.min.js"></script>
<script type="text/javascript">
function ContactController($scope) {
$scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}
</script>
</head>
<body>
<h1> modules sample </h1>
<div ng-controller="ContactController">
Email:<input type="text" ng-model="newcontact">
<button ng-click="add()">Add</button>
<h2> Contacts </h2>
<ul>
<li ng-repeat="contact in contacts"> {{contact}} </li>
</ul>
</div>
</body>
</html>
답변
Angular 1.3 이상에서는 더 이상 전역 범위에서 전역 컨트롤러 선언을 사용할 수 없습니다 (명시적인 등록없이). module.controller
구문을 사용하여 컨트롤러를 등록해야 합니다.
예:-
angular.module('app', [])
.controller('ContactController', ['$scope', function ContactController($scope) {
$scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}]);
또는
function ContactController($scope) {
$scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}
ContactController.$inject = ['$scope'];
angular.module('app', []).controller('ContactController', ContactController);
주요 변경 사항이지만 을 사용하여 전역을 사용하도록 끌 수 있습니다allowGlobals
.
예:-
angular.module('app')
.config(['$controllerProvider', function($controllerProvider) {
$controllerProvider.allowGlobals();
}]);
다음은 Angular 소스의 주석입니다.
- 주어진 이름의 컨트롤러가 다음을 통해 등록되었는지 확인하십시오.
$controllerProvider
- 현재 범위에서 문자열을 평가하면 생성자가 반환되는지 확인
- $ controllerProvider # allowGlobals 인
window[constructor]
경우 전역window
개체를 확인 합니다 (권장되지 않음).
.....
expression = controllers.hasOwnProperty(constructor)
? controllers[constructor]
: getter(locals.$scope, constructor, true) ||
(globals ? getter($window, constructor, true) : undefined);
몇 가지 추가 검사 :-
-
ng-app
각도 루트 요소 (예 :-)의 지시문 에도 appname을 넣어야합니다html
. 예 :-ng-app = “myApp” -
모든 것이 정상이고 여전히 문제가 발생하면 스크립트에 올바른 파일이 포함되어 있는지 확인하십시오.
-
동일한 모듈에 이전에 정의 된 개체의 결과는, 밖으로 지워 예 수있는 당신은 다른 장소에서 두 번 같은 모듈을 정의하지 않은
angular.module('app',[]).controller(..
다른 장소에서 다시angular.module('app',[]).service(..
(물론 포함 모두 스크립트)는에 이전에 등록 된 컨트롤러를 일으킬 수 있습니다 모듈app
의 두 번째 재생산으로 제거 할 모듈.
답변
컨트롤러 정의 파일을 클로저로 래핑했기 때문에이 문제가 발생했습니다.
(function() {
...stuff...
});
그러나 나는 실제로 그 클로저를 호출하여 그 정의 코드를 실행하고 실제로 Javascript에 내 컨트롤러가 존재한다고 말하는 것을 잊었다. 즉, 위의 내용은 다음과 같아야합니다.
(function() {
...stuff...
})();
끝에있는 ()에 유의하십시오.
답변
저는 Angular의 초보자이고 각 루트 요소에 앱 이름을 포함하지 않는 기본적인 실수를 저질렀습니다. 따라서 코드를
<html data-ng-app>
에
<html data-ng-app="myApp">
나를 위해 일했습니다. @PSL은 위의 답변에서 이미 이것을 다루었습니다.
답변
angular.module('myApp', [])
과 의 차이점을 이해하지 못했기 때문에이 오류가 발생했습니다 angular.module('myApp')
.
이렇게 하면 ‘myApp’모듈 이 생성 되고 ‘myApp’이라는 기존 모듈을 덮어 씁니다.
angular.module('myApp', [])
이 검색 기존 모듈 ‘을 myApp을’
angular.module('myApp')
예상대로 검색하는 대신 다른 모듈을 만든 위의 첫 번째 호출을 사용하여 다른 파일에서 내 모듈을 덮어 썼습니다.
답변
angular 1.3.3으로 마이그레이션하고 앱이 재정의되고 처음 선언 된 컨테이너를 잃었을 때 다른 파일에 여러 컨트롤러가있는 경우를 발견했습니다.
좋은 방법인지 모르겠지만 다른 방법에 도움이 될 수 있습니다.
var app = app;
if(!app) {
app = angular.module('web', ['ui.bootstrap']);
}
app.controller('SearchCtrl', SearchCtrl);
답변
실수로 다시 선언했을 때이 문제가 발생했습니다 myApp
.
var myApp = angular.module('myApp',[...]);
myApp.controller('Controller1', ...);
var myApp = angular.module('myApp',[...]);
myApp.controller('Controller2', ...);
재 선언 후 Controller1
작업을 중지하고 OP 오류를 발생시킵니다.
답변
루트 페이지에 중요한 스크립트 포함을 누락하여 동일한 오류가 발생할 수 있다는 점을 제외하면 정말 좋은 조언입니다 .
예:
페이지 : index.html
np-app="saleApp"
잃어버린
<script src="./ordersController.js"></script>
어떤 컨트롤러와 뷰를 제공 할 것인지 경로가 알려지면 :
.when('/orders/:customerId', {
controller: 'OrdersController',
templateUrl: 'views/orders.html'
})
따라서 정의되지 않은 컨트롤러 문제는 컨트롤러를 참조하지 않는 우연한 실수로 발생할 수 있습니다!