Ошибка AngularJS: 'аргумент' FirstCtrl 'не является функцией, получил undefined'

Я заметил, что один и тот же вопрос задавали несколько раз здесь, я пытался так решить, но ничего не помогает.

Я следую этому руководству с видео с яйцами.

Но когда я попадаю в раздел "Контроллеры и данные совместного доступа" между контроллерами, я не могу заставить его работать.

Когда я запускаю его с помощью Chrome, я получаю эту ошибку в консоли:

'аргумент' FirstCtrl 'не является функцией, получил undefined'.

Я действительно не знаю, что случилось. Код тот же, что и в учебнике.

Вот код для 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"};
} 

Ответ 1

У вас есть две неназванные директивы ng-app в вашем html.
Потеряйте одно в своем div.

Обновление
Попробуйте другой подход.
Определите модуль в файле js и назначьте ему директиву ng-app. После этого определите контроллер как компонент ng, а не как простую функцию:

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

и часть js:

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

Здесь онлайн-демонстрация, которая делает именно это: http://jsfiddle.net/FssbL/1/

Ответ 2

У меня получилось точно такое же сообщение об ошибке, и в моем случае оказалось, что я не перечислял JS файл контроллера (например, first-ctrl.js) в моем index.html

Ответ 3

Я только что сделал этот учебник и ответил @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"};
  });

Странно, как ng-приложение должно быть идентичным, но ng-controller этого не делает.

Ответ 4

Вы должны назвать свой 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.

Ответ 6

удалить ng-app = "" из

<div ng-app="">

и просто сделайте это

<div>

Ответ 7

Я тоже столкнулся с той же проблемой. Но проблема в том, что я забыл перечислить модуль в списке модулей, от которого зависит ng-app.

Ответ 8

Я столкнулся с этой проблемой и исправил ее следующим образом:

  • сначала удалите ng-app из:

    <html ng-app>
    
  • добавить имя ng-app в myApp:

    <div ng-app="myApp">
    
  • добавьте эту строку кода перед функцией:

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

окончательный вид script:

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

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

Ответ 9

В моем случае это сообщение происходит от забытой инъекции зависимостей в основном модуле

Ответ 10

Это может произойти, если у вас gulp неправильно сконфигурирован, чтобы добавить код приложения angular более одного раза. В моем случае это было в index.js, и он добавлял его как часть каталога js файлов (globbed в gulp) до и после моих объявлений контроллера. Как только я добавил исключение для index.js, которое не будет уменьшено и введено во второй раз, мое приложение начало работать. Еще один совет, если какое-либо из вышеперечисленных решений не решает вашу проблему.

Ответ 11

i столкнулся с этой проблемой, но я смог исправить эту проблему, переименовав контроллер, попробуйте его.

ctrlSub.execSummaryDocuments = function(){};

Ответ 12

иногда что-то не так в синтаксисе кода внутри функции вызывает эту ошибку. Проверьте правильность работы. В моем случае это произошло, когда я пытался назначить поля Json со значениями и использовал двоеточие: сделать присваивание вместо равенства sign =...

Ответ 13

У меня было два контроллера с тем же именем, которые были определены в двух разных файлах javascript. Раздражает, что angular не может дать более ясное сообщение об ошибке, указывающее на конфликт пространства имен.

Ответ 14

Я не уверен в этом учебнике, но у меня была такая же проблема, когда я забыл включить файл в процесс grunt/ gulp.

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

Надеюсь, что это поможет.

Ответ 15

Следите за своим обложкой. Я провел хороший час, преследуя эту ошибку.

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

пока я называю контроллер

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

Все они должны быть последовательно названы, в этом случае "Забыть p wdController с нижним регистром p.