Ответ 1
Удалите []
из имени ([myApp]) модуля
angular.module('myApp', [])
И добавьте ng-app="myApp"
в html, и он должен работать.
Использование AngularJS с Scala Play, я получаю эту ошибку.
Ошибка: аргумент 'MainCtrl' не является функцией, получил undefined
Я пытаюсь создать таблицу, состоящую из дней недели.
Пожалуйста, взгляните на мой код. Я проверил имя контроллера, но это кажется правильным. Примечание: Код, используемый из этого SO answer
index.scala.html
@(message: String)
@main("inTime") {
<!doctype html>
<html lang="en" ng-app>
<head>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
</head>
<div ng-controller="MainCtrl">
<table border="1">
<tbody ng-repeat='(what,items) in data'>
<tr ng-repeat='item in items'>
<td ngm-if="$first" rowspan="{{items.length}}">{{what}}</td>
<td>{{item}}</td>
</tr>
</tbody>
</table>
</div>
</html>
}
MainCtrl.js
(function() {
angular.module('[myApp]', []).controller('MainCtrl', function($scope) {
$scope.data = {
Colors: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
}
});
}());
Удалите []
из имени ([myApp]) модуля
angular.module('myApp', [])
И добавьте ng-app="myApp"
в html, и он должен работать.
FIRST.
проверьте правильность controller
в определениях маршрутов, так же как и имена контроллеров, которые вы определяете
communityMod.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/members', {
templateUrl: 'modules/community/views/members.html',
controller: 'CommunityMembersCtrl'
}).
otherwise({
redirectTo: '/members'
});
}]);
communityMod.controller('CommunityMembersCtrl', ['$scope',
function ($scope) {
$scope.name = 'Hello community';
}]);
разные имена контроллеров в этом примере приведут к ошибкам, но этот пример верен.
SECOND проверьте, импортирован ли ваш файл javascript:
<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>
У меня было такое же сообщение об ошибке (в моем случае: "Аргумент" languageSelectorCtrl 'не является функцией, получил undefined ").
После некоторого утомительного сравнения с Angular кодом семени, я узнал, что ранее я удалил ссылку на модуль контроллеров в app.js. (укажите его на https://github.com/angular/angular-seed/blob/master/app/js/app.js)
Итак, у меня было это:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.directives'])
Это не удалось.
И когда я добавил недостающую ссылку:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])
Сообщение об ошибке исчезло, а Angular может снова привести в действие контроллеры.
Несколько раз эта ошибка является результатом директив два ng-app
, указанных в html.
В моем случае по ошибке я указал ng-app
в теге html
и ng-app="myApp"
в теге body
следующим образом:
<html ng-app>
<body ng-app="myApp"></body>
</html>
Это серьезно заняло у меня 4 ЧАСА (включая бесконечные поиски на SO), но, наконец, я нашел его: по ошибке (непреднамеренно) я добавил где-то место.
Вы можете определить это?
angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);
Итак... Через 4 часа я увидел, что это должно быть:
angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);
Почти невозможно увидеть невооруженным глазом.
Это подчеркивает жизненно важное значение контроля над версиями (git или любого другого) и тестирования единицы/регрессии.
Я столкнулся с той же проблемой, и в моем случае это произошло в результате этой проблемы:
У меня были контроллеры, определенные в отдельном модуле (называемые "myApp.controllers" ) и вставляемые в основной модуль приложения (называемый "myApp" ) следующим образом:
angular.module('myApp', ['myApp.controllers'])
Коллега нажал другой модуль контроллера в отдельный файл, но с тем же именем, что и мой (т.е. "myApp.controllers" ), который вызвал эту ошибку. Я думаю, потому что Angular запутался между этими модулями контроллера. Однако сообщение об ошибке было не очень полезно при обнаружении ошибок.
В моем случае (с обзорной страницей и страницей "добавить" ) я получил это с настройкой маршрутизации, как показано ниже. Он выдавал сообщение для AddCtrl, которое не могло быть введено...
$routeProvider.
when('/', {
redirectTo: '/overview'
}).
when('/overview', {
templateUrl: 'partials/overview.html',
controller: 'OverviewCtrl'
}).
when('/add', {
templateUrl: 'partials/add.html',
controller: 'AddCtrl'
}).
otherwise({
redirectTo: '/overview'
});
Из-за маршрута when('/'
все мои маршруты перешли к обзору, и контроллер не смог сопоставляться с отображением страницы добавления/добавления маршрута. Это было непонятно, потому что я видел шаблон add.html, но его контроллер нигде не был найден.
Удаление маршрута '/', когда случай исправил эту проблему для меня.
Если вы находитесь в подмодуле, не забудьте объявить модуль в главном приложении. т.е.:
<scrip>
angular.module('mainApp', ['subModule1', 'subModule2']);
angular.module('subModule1')
.controller('MyController', ['$scope', function($scope) {
$scope.moduleName = 'subModule1';
}]);
</script>
...
<div ng-app="mainApp">
<div ng-controller="MyController">
<span ng-bind="moduleName"></span>
</div>
Если вы не объявите subModule1 в mainApp, вы получите аргумент "[ng: areq]" MyController "не является функцией, получившей undefined.
Вторая точка была моей ловушкой, но только для записи, возможно, это помогло кому-то где-то:
У меня была такая же проблема, и как раз перед тем, как я сошел с ума, я обнаружил, что забыл включить мой контроллер script.
Поскольку мое приложение основано на ASP.Net MVC, я решил сохранить себя вменяемым, вставив следующий фрагмент в мой App_Start/BundleConfig.cs
bundles.Add(new ScriptBundle("~/app").Include(
"~/app/app.js",
"~/app/controllers/*.js",
"~/app/services/*.js" ));
и Layout.cshtml
<head>
...
@Scripts.Render("~/app")
...
</head>
Теперь мне больше не придется думать о включении файлов вручную. Оглядываясь назад, я действительно должен был это сделать при настройке проекта...
Я получил правильную ошибку с LoginController, который я использовал в основном index.html. Я нашел два способа решения:
установка $controllerProvider.allowGlobals(), я нашел этот комментарий в Angular списке изменений "этот вариант может быть удобен для переноса старых приложений, но, пожалуйста, не используйте его в новых!" оригинальный комментарий к Angular
app.config(['$ controllerProvider', function ($ controllerProvider) { $ ControllerProvider.allowGlobals(); }]);
неправильный конструктор регистрирующего контроллера
перед
LoginController.$inject = ['$rootScope', '$scope', '$location'];
Теперь
app.controller('LoginController', ['$rootScope', '$scope', '$location', LoginController]);
'app' принадлежит app.js
var MyApp = {};
var app = angular.module('MyApp ', ['app.services']);
var services = angular.module('app.services', ['ngResource', 'ngCookies', 'ngAnimate', 'ngRoute']);
У меня была такая же ошибка с большой ошибкой:
appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope){
}]);
Вы видите? я забыл '' вокруг первой $scope, правильный синтаксис, конечно:
appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope){
}]);
Первая ошибка, которую я сразу не видел: "$ scope не определен", за ней следует "Ошибка: [ng: areq] Аргумент" TreeEditStepControlsCtrl "не является функцией, полученной undefined"
Может ли быть так же просто, как включение вашего ресурса в ", и что бы ни требовали цитаты изнутри с помощью?"
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
становится
<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">
Это может вызвать некоторые проблемы при анализе
Чтобы устранить эту проблему, мне пришлось обнаружить, что я ошибся с именем контроллера в объявлении маршрутов Angular:
.when('/todo',{
templateUrl: 'partials/todo.html',
controller: 'TodoCtrl'
})
Выключает кеш браузера, используя Chrome здесь. Просто проверьте "Отключить кеш" в разделе "Проверка" (Элемент), решив мою проблему.
В моем случае это была простая опечатка в index.html
:
<script src="assets/javascript/controllers/questionssIndexController.js"></script>
который должен был быть
<script src="assets/javascript/controllers/questionsIndexController.js"></script>
без дополнительного s
в имени контроллера.