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

Использование 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"]
        }
    });
}());

Ответ 1

Удалите [] из имени ([myApp]) модуля

angular.module('myApp', [])

И добавьте ng-app="myApp" в html, и он должен работать.

Ответ 2

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>

Ответ 3

У меня было такое же сообщение об ошибке (в моем случае: "Аргумент" 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 может снова привести в действие контроллеры.

Ответ 4

Несколько раз эта ошибка является результатом директив два ng-app, указанных в html. В моем случае по ошибке я указал ng-app в теге html и ng-app="myApp" в теге body следующим образом:

<html ng-app>
  <body ng-app="myApp"></body>
</html>

Ответ 5

Это серьезно заняло у меня 4 ЧАСА (включая бесконечные поиски на SO), но, наконец, я нашел его: по ошибке (непреднамеренно) я добавил где-то место.

Вы можете определить это?

angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);

Итак... Через 4 часа я увидел, что это должно быть:

angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);

Почти невозможно увидеть невооруженным глазом.

Это подчеркивает жизненно важное значение контроля над версиями (git или любого другого) и тестирования единицы/регрессии.

Ответ 6

Я столкнулся с той же проблемой, и в моем случае это произошло в результате этой проблемы:

У меня были контроллеры, определенные в отдельном модуле (называемые "myApp.controllers" ) и вставляемые в основной модуль приложения (называемый "myApp" ) следующим образом:

angular.module('myApp', ['myApp.controllers'])

Коллега нажал другой модуль контроллера в отдельный файл, но с тем же именем, что и мой (т.е. "myApp.controllers" ), который вызвал эту ошибку. Я думаю, потому что Angular запутался между этими модулями контроллера. Однако сообщение об ошибке было не очень полезно при обнаружении ошибок.

Ответ 7

В моем случае (с обзорной страницей и страницей "добавить" ) я получил это с настройкой маршрутизации, как показано ниже. Он выдавал сообщение для 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, но его контроллер нигде не был найден.

Удаление маршрута '/', когда случай исправил эту проблему для меня.

Ответ 8

Если вы находитесь в подмодуле, не забудьте объявить модуль в главном приложении. т.е.:

<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.

Ответ 9

Вторая точка была моей ловушкой, но только для записи, возможно, это помогло кому-то где-то:

У меня была такая же проблема, и как раз перед тем, как я сошел с ума, я обнаружил, что забыл включить мой контроллер 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>

Теперь мне больше не придется думать о включении файлов вручную. Оглядываясь назад, я действительно должен был это сделать при настройке проекта...

Ответ 10

Я получил правильную ошибку с 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']);

Ответ 11

У меня была такая же ошибка с большой ошибкой:

appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope){

}]);

Вы видите? я забыл '' вокруг первой $scope, правильный синтаксис, конечно:

appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope){

}]);

Первая ошибка, которую я сразу не видел: "$ scope не определен", за ней следует "Ошибка: [ng: areq] Аргумент" TreeEditStepControlsCtrl "не является функцией, полученной undefined"

Ответ 12

Может ли быть так же просто, как включение вашего ресурса в ", и что бы ни требовали цитаты изнутри с помощью?"

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

становится

<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">

Это может вызвать некоторые проблемы при анализе

Ответ 13

Чтобы устранить эту проблему, мне пришлось обнаружить, что я ошибся с именем контроллера в объявлении маршрутов Angular:

.when('/todo',{
            templateUrl: 'partials/todo.html',
            controller: 'TodoCtrl'
        })

Ответ 14

Выключает кеш браузера, используя Chrome здесь. Просто проверьте "Отключить кеш" в разделе "Проверка" (Элемент), решив мою проблему.

Ответ 15

В моем случае это была простая опечатка в index.html:

<script src="assets/javascript/controllers/questionssIndexController.js"></script>

который должен был быть

<script src="assets/javascript/controllers/questionsIndexController.js"></script>

без дополнительного s в имени контроллера.