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


120

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

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

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

Будь ласка, подивіться на мій код. Я перевірив ім'я контролера, але це здається правильним. Примітка: Код, використаний з цієї відповіді на SO

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"]
        }
    });
}());

15
У HTML, де ви використовували, ng-appможете змінити його наng-app=myApp
Chandermani

Отримав таку ж помилку @Chandermani
Кевін Мередіт

Ви намагалися видалити закриття (IIFE) з коду? Коли у мене була ця проблема, це було через те, що в моєму JavaScript виник помилка PHP.
Кевін Біл

1
Дізнатися свою проблему можна за цим контрольним списком: stackoverflow.com/a/26797874/930170
Сергій Панфілов

Підтвердьте, що ви додали MainCtrl.controller.js у файл BundleConfig.cs
Syed Mohamed

Відповіді:


107

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

angular.module('myApp', [])

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


1
Все, що мені потрібно було зробити, щоб він працював - це друга пропозиція (тобто встановити ng-app = "myApp"). Якщо я видалив [], я отримав ще одну помилку.
Джейсон

15
Наявність другого параметра []вказує на те, що ви створюєте новий модуль. Видалення другого параметра вказує на те, що ви отримуєте існуючий модуль. Отже, одна з можливостей перевірити - якщо ви телефонуєте angular.moduleдвічі, обидва рази включаючи другий параметр. Якщо це так, пізніше виникнення замінить друге, приховавши будь-які визначення контролерів до цього моменту.
Карл Г

26
Коли він говорить про вилучення, []він посилається на перший параметр, де [myApp]замість цього є ОП myApp. Він не говорить про другий параметр.
Кевін Біл

1
Перевірте ім'я контролера, якщо ви використовуєте маршрути. Назва контролера у визначенні маршруту залежить від регістру.
Латинський воїн

78

ПЕРШИЙ. перевірте, чи є 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';
    }]);

різні назви контролерів у цьому прикладі призведуть до помилок, але цей приклад є правильним

ДРУГО перевірте, чи імпортували ви файл JavaScript:

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


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

Це був і другий у моєму випадку, забув імпортувати файл JS ...
Saurabh Misra

26

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

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


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

16

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

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

1
Сталося зі мною, коли я не додав ін'єкцію до модуля myApp.
Ghandhikus

Дякую! Це вирішило мою проблему.
bradden_gross

6

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

Ви можете це помітити?

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

Отже ... 4 години потому я побачив, що так і повинно бути:

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

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

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


1
Моя відповідь не була зайвою площею, але це призвело до мого виправлення. Я мав Controllerзамість цього, controllerі це було все, що потрібно.
Grandizer

І я назвав свої параметри файлів-moda.controller.js, але шукав варіанти-modal.controller.js DOH!
TheFish

Моє було через те, що я забув додати .js у BundleConfig. Простий, але розчаровуючий.
Еге Байрак

4

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

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

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

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


1
Це слід виправити, видаливши другий параметр у модулі ... Щоб отримати існуючий модуль, використовуючи angular.module ('myApp') без другого параметра. тобто angular.module ('myApp'). contoller (...)
Сантош

3

У моєму випадку (маючи сторінку огляду та сторінку "додати") я отримав це за допомогою моєї настройки маршрутизації, як показано нижче. Це давало повідомлення для 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('/'маршрут усі мої маршрути перейшли до огляду, і контролер не міг відповідати на / додавати сторінку маршруту. Це було заплутано, оскільки я DID бачив шаблон add.html, але його контролера ніде не було знайдено.

Видалення маршруту '/', коли випадок вирішив цю проблему для мене.


Я також отримував цю помилку і виривав волосся, оскільки це спричиняло збій моїх збірок TFS. Коментуючи маршрут "/", це було виправлено і для мене. Тепер розібратися, чому!
Філіп Коплі

3

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

<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 "не є функцією, не визначений.


2

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

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

Оскільки моє додаток базується на 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>

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


1

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

  1. встановивши $ controllerProvider.allowGlobals (), я знайшов цей коментар у кутовому списку змін "ця опція може бути зручною для міграції старих програм, але будь ласка, не використовуйте її в нових!" оригінальний коментар на Angular

    app.config (['$ controllerProvider', функція ($ controllerProvider) {$ controllerProvider.allowGlobals ();}]);

  2. неправильний кондуктор реєстрації контролера

раніше

LoginController.$inject = ['$rootScope', '$scope', '$location'];

зараз

app.controller('LoginController', ['$rootScope', '$scope', '$location', LoginController]);

"додаток" походить від 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){

}]);

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

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

}]);

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


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

Щоб виправити цю проблему, я повинен був виявити, що я неправильно написав ім'я контролера в оголошенні кутових маршрутів:

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

0

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

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

це мало бути

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

без зайвого sна ім'я контролера.


0

Виявляється, це кеш браузера, тут використовується Chrome. Просто перевірте "Вимкнути кеш-пам'ять" в розділі "Перевірити (елемент"), що вирішив мою проблему.


0

Оскільки ця спливаюча інформація в Google намагається знайти відповідь на тему: "Помилка: аргумент" "не є функцією, не визначено".

Можливо, ви намагаєтесь створити один і той же модуль двічі.

Angular.module - це глобальне місце для створення, реєстрації та отримання модулів AngularJS.

Передача одного аргументу отримує існуючий angular.Module, тоді як передача більше одного аргументу створює новий angular.Module

Джерело: https://docs.angularjs.org/api/ng/function/angular.module#overview

Приклад:

angular.module('myApp', []) Використовується для створення модуля без введення будь-яких залежностей.

angular.module('myApp') (Без аргументу) використовується для отримання існуючого модуля.


0

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

У моєму випадку я не оголосив контролер у app/index.html:

<scipt src="src/controllers/controller-name.controller.js"></script>

Помилка пішла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.