Помилка: Аргумент не є функцією, не визначено

Використовуючи AngularJS з Scala Play, я отримую цю помилку.

Помилка: аргумент "MainCtrl" не є функцією, не визначено

Я намагаюся створити таблицю, що складається з днів тижня.

Please take a look at my code. I had checked the name of the Controller, but that seems correct. Note: Code used from this SO answer

index.scala.html

@(message: String)

@main("inTime") {

<!DOCTYPE HTML>

    <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"]
        }
    });
}());
117
Отримав ту ж помилку @Candermani
додано Автор Kevin Meredith, джерело
У html, де ви використовували ng-app , ви можете змінити його на ng-app = myApp
додано Автор Chandermani, джерело
Ви можете дізнатися свою проблему за цим контрольним списком: stackoverflow.com/a/26797874/930170
додано Автор Sergei Panfilov, джерело
Ви намагалися видалити закриття (IIFE) з коду? Коли я мав цю проблему, це було тому, що у мене була помилка PHP у своєму javascript.
додано Автор Kevin Beal, джерело
Підтвердьте, чи додано MainCtrl.controller.js у файл BundleConfig.cs
додано Автор Syed Mohamed, джерело

15 Відповіді

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

angular.module('myApp', [])

Додайте ng-app = "myApp" у html, і він повинен працювати.

105
додано
Наявність другого параметра [] означає, що ви створюєте новий модуль. Видалення другого параметра вказує на те, що ви отримуєте існуючий модуль. Таким чином, одна можливість перевірити, якщо ви дзвоните angular.module двічі, обидва рази, включаючи другий параметр. Якщо так, то пізніше виникне перезапис другого, приховуючи будь-які визначення контролерів до цього моменту.
додано Автор Carl G, джерело
Все, що мені треба було зробити, щоб це працювало, було другою пропозицією (тобто встановити ng-app = "myApp"). Якщо я видалив [], я отримав іншу помилку.
додано Автор Jason, джерело
Коли він каже, щоб видалити [] , він посилається на перший параметр, де ОП має [myApp] замість myApp . Він не говорить про другий параметр.
додано Автор Kevin Beal, джерело
Перевірте назву контролера, якщо ви використовуєте маршрути. Ім'я контролера у визначенні маршруту чутливо до регістру.
додано Автор Latin Warrior, джерело

FIRST. check if you have correct controller in the route definitions, same as the controller names that you are defining

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 check if you have imported your JavaScript file:

<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>

76
додано
З мого досвіду, ваша "друга" завжди є проблемою. Я часто забуваю імпортувати контролери в index.html
додано Автор msanford, джерело

У мене було таке ж повідомлення про помилку (у моєму випадку: "Аргумент 'languageSelectorCtrl' не є функцією, отримав невизначений").

Після деякого стомлюючого порівняння з кодом Angular seed, я дізнався, що раніше видалив посилання на модуль контролерів в 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 знову могла встановити контролери.

26
додано
була така ж проблема, моя проблема полягала в тому, що я забув додати свій контролер до модуля програми ... чому це не відбувається автоматично ??? так чи інакше спасибі!
додано Автор TheZuck, джерело

Іноді ця помилка є наслідком директив двох ng-app , вказаних у html. У моєму випадку помилково вказав ng-app у тезі html і ng-app = "myApp" у тілі Тег :


  <body ng-app="myApp"></body>
</html>
16
додано
Це сталося зі мною, коли я не додав ін'єкцію до модуля myApp.
додано Автор Sonny, джерело
Дякую! Це вирішило мою проблему.
додано Автор bradden_gross, джерело

Це серйозно зайняло у мене 4 ГОДИНИ (включаючи нескінченні пошуки на SO), але, нарешті, я знайшов його: помилково (ненавмисно) я десь додав простір.

Чи можете ви його помітити?

angular.module ('bwshopper.signup'). контролер ('SignupCtrl', SignupCtrl);

Отже ... Через 4 години я побачив, що це має бути:

angular.module ('bwshopper.signup'). контролер ('SignupCtrl', SignupCtrl);

Майже неможливо побачити просто неозброєним оком.

Це підкреслює життєву важливість контролю перегляду (git або будь-який інший) та тестування на одиницю/регресію.

5
додано
Моя відповідь не була додатковим простором, але це привело мене до мого виправлення. Я мав Контролер замість контролера , і це все, що потрібно.
додано Автор Grandizer, джерело

Я зіткнувся з такою ж проблемою, і в моєму випадку це сталося в результаті цієї проблеми:

У мене були контролери, визначені в окремому модулі (так званий "myApp.controllers") і введений у головний модуль програми (так званий "myApp"), як це:

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

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

4
додано
Це має бути виправлено видаленням другого параметра в модулі ... Щоб отримати існуючий модуль за допомогою angular.module ('myApp') без другого параметра. тобто angular.module ("myApp"). contoller (...)
додано Автор user200753, джерело

У моєму випадку (маючи оглядову сторінку і сторінку "додати") я отримав це з моїм налаштуванням маршрутизації, як показано нижче. Це дало повідомлення для AddCtrl, який не можна було ввести ...

$routeProvider.
  when('/', {
    redirectTo: '/overview'
  }).      
  when('/overview', {
    templateUrl: 'partials/overview.html',
    controller: 'OverviewCtrl'
  }).
  when('/add', {
    templateUrl: 'partials/add.html',
    controller: 'AddCtrl'
  }).
  otherwise({
    redirectTo: '/overview'
  });

Через , коли ('/' маршрут всі мої маршрути перейшли до огляду і контролер не може бути підібраний на/додавати сторінку маршрутизації. Це було плутаниною, тому що я DID бачити шаблон add.html але його контролера ніде не було знайдено.

Видалення маршруту '/' у разі виправлення цієї проблеми для мене.

3
додано
Я отримував цю помилку, а також і розриваючи моє волосся, тому що це викликало мої TFS будує на провал. Коментуючи маршрут '/', це також було встановлено для мене. Тепер, щоб з'ясувати, чому!
додано Автор Phillip Copley, джерело

Другий момент Умеда - це мій підводний камень, але тільки для запису, можливо, він допомагає комусь:

У мене була та ж проблема, і тільки перед тим, як я пішов гайки я виявив, що я забув включити свій скрипт контролера.

As my app is based on ASP.Net MVC I decided to keep myself sane by inserting the following snippet in my App_Start/BundleConfig.cs

bundles.Add(new ScriptBundle("~/app").Include(
                "~/app/app.js",
                "~/app/controllers/*.js",
                "~/app/services/*.js" ));

and in Layout.cshtml

<head>
...
   @Scripts.Render("~/app")
...
</head>

Тепер мені не доведеться думати про включення файлів вручну ніколи. У ретроспективі я дійсно мав би це зробити при створенні проекту ...

2
додано

Якщо ви перебуваєте в підмодулі, не забудьте оголосити модуль у головному додатку. тобто:


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">
   
</div>

If you don't declare subModule1 in mainApp, you will got a "[ng:areq] Argument "MyController" is not a function, got undefined.

2
додано

У моєму випадку це була проста помилка в index.html :

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

що повинно було бути

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

без додаткового s у назві контролера.

1
додано

Я отримав розсудливу помилку з LoginController, який я використав у main index.html. Я знайшов два способи вирішення:

  1. setting $controllerProvider.allowGlobals(), I found that comment in Angular change-list "this option might be handy for migrating old apps, but please don't use it in new ones!" original comment on Angular

    app.config(['$controllerProvider', function($controllerProvider) { $controllerProvider.allowGlobals(); }]);

  2. wrong contructor of registering controller

раніше

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']);
1
додано

У мене була така ж помилка з великою помилкою:

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

}]);

Розумієш ? я забув '' навколо першого $ scope, правильний синтаксис, звичайно:

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

}]);

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

1
додано

Щоб виправити цю проблему, мені довелося виявити, що я неправильно написав ім'я контролера в декларації Angular routes:

.when('/todo',{
            templateUrl: 'partials/todo.html',
            controller: 'TodoCtrl'
        })
0
додано

Виявляється, це кеш браузера, використовуючи тут Chrome. Просто перевірте "Disable cache" під Inspect (Element), вирішивши мою проблему.

0
додано

Чи може він бути таким же простим, як укладання вашого активу в "" і все, що потрібно в котируваннях з ""?

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

стає

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

Це може спричинити деякі проблеми при аналізі

0
додано