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

Я играю с AngularJS, но у меня появляется сообщение об ошибке: Argument 'Controller' is not a function, got undefined Здесь JSFiddle и код HTML:

<h2>Hata Tree-Like Set</h2>
<div ng-app ng-init="N=3;" ng-controller="Controller">
<input type="range" min="1" max="10" step="1" ng-model="N">  
<div class="tree"></div>
</div

Затем я определяю функцию Controller в JavaScript, которая по какой-либо причине не регистрируется.

function Controller($scope){
$scope.$watch("N", function(){  ... });}

Ответы

Ответ 1

У меня была точно такая же ошибка: argument 'HelloCtrl' is not a function, получил undefined.

Оказывается, у меня была синтаксическая ошибка в моем файле hello.js... отсутствующая запятая в определении массива внутри HelloCtrl().

Я добавил запятую, и тогда все стало работать!

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

Ответ 2

У меня была такая же ошибка... аргумент 'RadioController' не является функцией...

Я ссылался на неправильный контроллер в HTML. У меня был

data-ng-controller="RadioController"

когда это должно было быть

 data-ng-controller="Radio.RadioController"

( "Радио" - это модуль, в котором находился контроллер)

Ответ 3

В варианте вашей скрипки вы выбираете выполнить javasctipt onLoad. С помощью опции onLoad ваш javascript добавляется в функцию window.onLoad:

    window.onload=function(){
       function Controller($scope){
          ...
       }
    }

Так что angular не может получить доступ к вашему коду, потому что он находится в закрытии.

С помощью параметра no wrap ваш код будет добавлен непосредственно на страницу и доступен для angular: JSFiddle.

Вы можете просмотреть источник, чтобы узнать, как он работает.

Ответ 4

Вы можете определить контроллер и зарегистрировать его за один шаг:

angular.module('myModule').controller('MyCtrl', function($scope) {
  $scope.$watch ....
});

Если вы хотите, чтобы код работал правильно после его минимизации, вы должны явно указать зависимость от $scope:

angular.module('myModule').controller('MyCtrl', ['$scope', function(s) { 
  // you can now name the $scope argument whatever you want
  ...
}]);

Ответ 5

Мне тоже было непросто. Причиной моей проблемы было то, что у меня была старая версия Angular, которая не поддерживала новое сглаживание as.

Убедитесь, что у вас установлена ​​последняя версия Angular, которая поддерживает as.

Ответ 6

Правильно ли вы настроили свой $controllerProvider?

Из документации:

Имя функции-конструктора, зарегистрированное в текущем $controllerProvider, или выражение, которое в текущей области оценивается функцией-конструктором.

Экземпляр контроллера можно опубликовать в свойстве scope, указав ng-controller = "as propertyName".

Если текущий $controllerProvider настроен на использование глобальных переменных (через $controllerProvider.allowGlobals()), это также может быть именем глобальной функции конструктора (не рекомендуется).

Ответ 7

Ну, мне удалось решить эту ошибку, понизив до прежнего angular JS (1.2.27).

Тот же синтаксис (вы использовали выше) для определения контроллера и angular JS (1.3.2) - это комбинация, вызвавшая эту ошибку.

С помощью angular (1.3.2) для меня работал следующий синтаксис.

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

app.controller('helloController', function($scope){
    <write statements here>
});

Ответ 8

Нет необходимости переходить к более старым версиям. Вы можете использовать как метод как, так и метод angular.module.

Также порядок загрузки файлов должен быть правильным.

(Рассмотрите необходимость js, если вам трудно запомнить порядок загрузки файлов)

Ответ 9

Мне пришлось переупорядочить теги script. Я поставил контроллер выше, чем другой.

Принял меня на несколько часов, надеюсь, что это поможет кому-то еще

Ответ 10

У меня была эта ошибка - я ошибся в имени моего контроллера.

Он был зарегистрирован как CallbacksController... взял на меня пять минут ругательства, чтобы определить разницу в делах (подсказка - капитал B в моем случае!).