Аргумент... не является функцией, получил 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 в моем случае!).