AngularJS 오류 : '인수'FirstCtrl '은 함수가 아니므로 정의되지 않았습니다.'


93

여기에서 몇 번 같은 질문을 받았는데, 그래서 해결하려고했지만 도움이되지 않았습니다.

저는이 튜토리얼을 지식인 비디오와 함께 따르고 있습니다.

그러나 컨트롤러 및 컨트롤러 간 데이터 공유 섹션에 도달하면 작동하지 않습니다.

Chrome으로 실행할 때 콘솔에 다음 오류가 표시됩니다.

'인수'FirstCtrl '은 함수가 아니므로 정의되지 않았습니다.'

나는 정말로 무엇이 잘못되었는지 모른다. 코드는 튜토리얼과 동일합니다.

HTML

<!DOCTYPE html>
<html ng-app>
 <head>
    <title>AngularJS Tutorials: Controllers</title>
    <link rel="stylesheet" href="mystyle.css">
    <script src="http://code.angularjs.org/1.2.0-rc.2/angular.min.js"></script>
 </head>
 <body>
    <div ng-app="">
       <div ng-controller="FirstCtrl">   
           <h1> {{data.message + " world"}}</h1>

           <div class="{{data.message}}">
               Wrap me in a foundation component
           </div>
       </div>
    </div>
    <script type="text/javascript" src="main.js"></script>
 </body>
</html> 

main.js

function FirstCtrl($scope){
   $scope.data = { message: "Hello" };
} 

여기에 두 번째 의견의 솔루션입니다 - stackoverflow.com/questions/24894870/...
— 칸찬

답변:


108

ng-apphtml에 2 개의 이름없는 지시문이 있습니다.
당신의 사업부에서 하나를 잃으십시오.

업데이트
다른 접근 방식을 시도해 보겠습니다.
js 파일에 모듈을 정의하고 ng-app지시문을 할당하십시오 . 그런 다음 컨트롤러를 간단한 함수가 아닌 ng 구성 요소처럼 정의하십시오.

<div ng-app="myAppName">  
<!-- or what's the root node of your angular app -->

그리고 js 부분 :

angular.module('myAppName', [])
    .controller('FirstCtrl', function($scope) {
         $scope.data = {message: 'Hello'};
    });

다음은이를 수행하는 온라인 데모입니다. http://jsfiddle.net/FssbL/1/


답변 주셔서 감사합니다. 슬프게도 여전히 동일한 오류가 발생합니다. div에서 ng-app = ""를 잃어 버렸지 만 여전히 작동하지 않습니다.
— Pumba

1
도와 주셔서 정말 감사합니다! 더 이상 이해가되지 않습니다. 여기와 온라인 데모에서 보여준 것과 똑같은 작업을 수행했지만 여전히 'FirstCtrl'이 정의되지 않았다고 표시됩니다. 처음부터 다시 시도해 보겠습니다. 다음 튜토리얼에서 동일한 문제가 발생하기 때문에 제대로 작동하기를 바랍니다.
— Pumba

큰!! 효과가있다. js 파일의 스크립트 태그에서 유형 속성을 닫는 것을 잊었습니다. 두 번째 솔루션과 결합하여 작동했습니다! :)) 정말 감사합니다
— 품바

6
데모 비디오는 모듈 내에서 컨트롤러를 감싸지 않습니다. 그렇다면 왜 그에게 효과가 있지만 나는 그렇지 않습니까? egghead.io/lessons/angularjs-controllers
— Demodave dec. 2014

2
@Demodave, 같은 질문이 있습니다. 비디오가 AngularJS의 이전 버전에서 녹화 되었기 때문에 컨트롤러를 정의하는 것이 잠재적으로 덜 엄격하다고 가정합니다 (하지만 내 가정에 불과합니다. 누군가 확인하거나 거부하면 기뻐할 것입니다)
— MandM

93

정확히 똑같은 오류 메시지가 나타 났고 제 경우에는 index.html에 컨트롤러 JS 파일 (예 : first-ctrl.js)을 나열하지 않은 것으로 나타났습니다.


1
컨트롤러 js 파일을 나열하지 않았다는 것은 무엇을 의미합니까? 당신이 그것을 포함하지 않았다는 말입니까?
— Demodave

@DavidStone 예-그 당시 제 경우였습니다.
— Mariusz

또 다른 멍청한 오류 : 컨트롤러의 루즈 괄호 등으로 인해 동일한 유형의 오류가 콘솔에 표시 될 수 있습니다.
— user2938649

9

방금이 튜토리얼을 수행하고 @ gion_13 답변을 따랐습니다. 여전히 작동하지 않았습니다. 색인의 내 ng-app 이름을 내 js 파일의 이름과 동일하게 만들어 해결했습니다 . 따옴표조차 정확히 동일합니다. 그래서:

<div ng-app="myapp">
    <div ng-controller="FirstCtrl">

그리고 js :

 angular.module("myapp", [])
.controller('FirstCtrl',function($scope) {
    $scope.data= {message:"hello"};
  });

이상한은 어떻게 겨 - 응용 프로그램은 동일해야하지만 겨 컨트롤러는 하지 않습니다.


발로 시간이 비용 나에게 (감사 마지막으로 도와 저를 알아낼.
— Dowlers

7

당신은 당신의 이름을 지정해야합니다ng-app 앱을 제공하는 네임 스페이스를; 단순히 사용하는 것만으로 ng-app 는 충분하지 않습니다 .

대신에:

<html ng-app>
...

대신 다음과 같은 것이 필요합니다.

<html ng-app="app">
...

그런 다음 이렇게 :

var app = angular.module("app", []).controller("ActionsController", function($scope){});

5

또 다른 좋은 점은 실수로 모듈을 재정의하는 것입니다. 오늘 초 너무 열심히 복사 / 붙여 넣기를했는데 어딘가에 모듈 정의가 생겼고, 컨트롤러 정의를 덮어 썼습니다.

// controllers.js - dependencies in one place, perfectly fine
angular.module('my.controllers', [/* dependencies */]);

그런 다음 내 정의에서 다음과 같이 참조해야했습니다.

// SomeCtrl.js - grab the module, add the controller
angular.module('my.controllers')
 .controller('SomeCtrl', function() { /* ... */ });

대신 내가 한 일은 다음과 같습니다.

// Do not try this at home!

// SomeCtrl.js
angular.module('my.controllers', []) // <-- redefined module, no harm done yet
  .controller('SomeCtrl', function() { /* ... */ });

// SomeOtherCtrl.js
angular.module('my.controllers', []) // <-- redefined module - SomeCtrl no longer accessible
  .controller('SomeOtherCtrl', function() { /* ... */ });

에 대한 호출에서 추가 대괄호를 확인합니다 angular.module.


3

ng-app = ""제거

<div ng-app="">

그리고 간단하게

<div>

3
앱 구성에서 라우팅을 사용하는 경우 html에서 ng-controller를 사용하지 마십시오. 대신 ng-view가 있어야합니다. 컨트롤러는 일반적으로 라우팅의보기와 함께 정의됩니다.
— Marc

1

저도 같은 문제에 직면했습니다. 하지만 문제는 ng-app이 의존하는 모듈 목록에 모듈을 나열하는 것을 잊었다는 것입니다.


3
이것은 답변이 아니라 의견이어야합니다.
— 앤소니 페로

1

이 문제에 직면했으며 다음과 같은 방법으로 해결되었습니다.

  1. 먼저 ng-app을 다음에서 제거하십시오.

    <html ng-app>
  2. myApp에 ng-app 이름 추가 :

    <div ng-app="myApp">
  3. 함수 앞에 다음 코드 줄을 추가하십시오.

    angular.module('myApp', []).controller('FirstCtrl',FirstCtrl);

스크립트의 최종 모습 :

angular.module('myApp', []).controller('FirstCtrl',FirstCtrl);

function FirstCtrl($scope){
    $scope.data = {message: "Hello"};
} 


1

이는 각도 앱 코드를 두 번 이상 추가하도록 잘못 구성한 경우 발생할 수 있습니다. 필자의 경우 이것은 index.js에 있었고 컨트롤러 선언 전후에 js 파일 디렉토리의 일부로 추가했습니다 (gulp로 표시됨). index.js가 축소되지 않고 두 번째로 주입되지 않도록 제외를 추가하면 앱이 작동하기 시작했습니다. 위의 해결 방법 중 하나라도 문제를 해결하지 못하는 경우 또 다른 팁입니다.


1

첫째-모듈 이름이 정의되어 있지 않으면 JS에서 모듈에 액세스하고 컨트롤러를 연결할 수 없습니다.

앵귤러 모듈에 모듈 이름을 제공해야합니다. 정의 모듈을 사용하는 것에도 차이가 있습니다. 1. angular.module ( "firstModule", []) 2. angular.module ( "firstModule")

1-하나는 두 번째 인수에 추가 된 종속성없이 새 모듈 "firstModule"을 선언하는 것입니다. 2-다른 곳에서 초기화 된 "firstModule"을 사용하고 초기화 된 모듈을 가져 와서 수정하려고합니다.


0

이 문제에 직면했지만 컨트롤러 이름을 변경하여이 문제를 해결할 수있었습니다. 시도해보십시오.

ctrlSub.execSummaryDocuments = function(){};

0

때때로 함수 내부의 코드 구문에 문제가 있으면이 오류가 발생합니다. 기능을 올바르게 확인하십시오. 제 경우에는 Json 필드에 값을 할당하려고 할 때 콜론을 사용하여 등호 = 대신 할당을 만들 때 발생했습니다.


0

두 개의 다른 자바 스크립트 파일에 동일한 이름을 가진 두 개의 컨트롤러가 정의되어 있습니다. 해당 각도를 자극하면 네임 스페이스 충돌을 나타내는 명확한 오류 메시지를 제공 할 수 없습니다.


0

이 튜토리얼에 대해 잘 모르겠지만 파일을 grunt / gulp 최소화 프로세스에 포함하는 것을 잊었을 때 동일한 문제가 발생했습니다.

grunt.initConfig({
  uglify: {
    my_target: {
      files: {
        'dest/output.min.js': ['src/input1.js', 'src/missing_controller.js']
      }
    }
  }
});

도움이 되었기를 바랍니다.


0

편지 케이스도 조심하세요. 이 버그를 쫓는 데 좋은 시간을 보냈습니다.

<section id="forgotpwd" ng-controller="ForgotPwdController">

컨트롤러 이름을 지정하는 동안

angular
    .module('app')
    .controller('ForgotpwdController', ForgotpwdController);

모두 일관되게 이름을 지정해야합니다.이 경우 소문자 p를 사용하는 p wdController를 잊어 버렸습니다 .

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