Błąd: argument nie jest funkcją, został zdefiniowany


120

Używając AngularJS ze Scala Play, otrzymuję ten błąd.

Błąd: argument „MainCtrl” nie jest funkcją, został niezdefiniowany

Próbuję stworzyć tabelę składającą się z dni tygodnia.

Spójrz na mój kod. Sprawdziłem nazwę kontrolera, ale wydaje się, że jest poprawna. Uwaga: kod użyty w tej odpowiedzi 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
W html, gdzie ng-appng-app=myApp
— używałeś,

Mam ten sam błąd @Chandermani
— Kevin Meredith,

Czy próbowałeś usunąć zamknięcie (IIFE) z kodu? Kiedy miałem ten problem, było to spowodowane błędem PHP w moim javascript.
— Kevin Beal,

1
Możesz sprawdzić swój problem, korzystając z tej listy kontrolnej: stackoverflow.com/a/26797874/930170
— Sergei Panfilov

Potwierdź, czy dodałeś plik MainCtrl.controller.js w pliku BundleConfig.cs
— Syed Mohamed

Odpowiedzi:


107

Usuń []z nazwy ([myApp]) modułu

angular.module('myApp', [])

I dodaj ng-app="myApp"do HTML i powinno działać.


1
Wszystko, co musiałem zrobić, aby to działało, to druga sugestia (tj. Set ng-app = "myApp"). Jeśli usunąłem [], pojawił się kolejny błąd.
— Jason,

15
Posiadanie drugiego parametru []oznacza, że ​​tworzysz nowy moduł. Usunięcie drugiego parametru oznacza, że ​​pobierasz istniejący moduł. Tak więc jedną z możliwości sprawdzenia jest to, czy dzwonisz angular.moduledwa razy, za każdym razem włączając drugi parametr. Jeśli tak, to późniejsze wystąpienie nadpisze drugie, ukrywając definicje kontrolerów do tego momentu.
— Carl G,

26
Kiedy mówi o usunięciu [], odnosi się do pierwszego parametru, w którym OP ma [myApp]zamiast myApp. Nie mówi o drugim parametrze.
— Kevin Beal

1
Sprawdź nazwę kontrolera, jeśli używasz tras. W nazwie kontrolera w definicji trasy rozróżniana jest wielkość liter.
— Latin Warrior

78

PIERWSZY. sprawdź, czy masz poprawne controllerdefinicje tras, takie same jak nazwy kontrolerów, które definiujesz

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

różne nazwy kontrolerów w tym przykładzie prowadzą do błędów, ale ten przykład jest poprawny

PO DRUGIE sprawdź, czy zaimportowałeś plik javascript:

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


30
Z mojego doświadczenia wynika, że ​​problem zawsze stanowi twoja „druga”. Często zapominam o zaimportowaniu moich kontrolerów doindex.html
— msanford,

W moim przypadku był to również drugi, zapomniałem zaimportować pliku JS ...
— Saurabh Misra

26

Miałem ten sam komunikat o błędzie (w moim przypadku: „Argument 'languageSelectorCtrl' nie jest funkcją, został zdefiniowany”).

Po żmudnym porównaniu z kodem zarodka Angulara dowiedziałem się, że wcześniej usunąłem odniesienie do modułu controllers w app.js. (znajdź to na https://github.com/angular/angular-seed/blob/master/app/js/app.js )

Więc miałem to:

angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.directives'])

To się nie udało.

A kiedy dodałem brakujące odniesienie:

angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])

Komunikat o błędzie zniknął i Angular mógł ponownie zainicjować kontrolery.


miał ten sam problem, moim problemem było to, że zapomniałem dodać kontrolera do modułu aplikacji ... dlaczego nie dzieje się to automatycznie? w każdym razie dzięki!
— TheZuck

16

Czasami ten błąd jest wynikiem dwóch ng-app dyrektyw określonych w html. W moim przypadku przez pomyłkę określiłem ng-appw swoim htmltagu i ng-app="myApp"w bodytagu w następujący sposób:

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

1
Zdarzyło mi się to, gdy nie dodałem wtrysku do modułu myApp.
— Ghandhikus

Dziękuję Ci! To rozwiązało mój problem.
— bradden_gross

6

To poważnie zajęło mi 4 GODZINY (wliczając niekończące się wyszukiwania na SO), ale w końcu to znalazłem: przez pomyłkę (nieumyślnie) dodałem gdzieś spację.

Czy potrafisz to dostrzec?

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

Więc ... 4 godziny później zobaczyłem, że powinno być:

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

Prawie niemożliwe do zobaczenia gołym okiem.

Podkreśla to kluczowe znaczenie kontroli wersji (git lub cokolwiek) oraz testów jednostkowych / regresyjnych.


1
Moja odpowiedź nie była dodatkową przestrzenią, ale doprowadziła mnie do mojej poprawki. Miałem Controllerzamiast controlleri to wystarczyło.
— Grandizer

I nazwałem mój plik options-moda.controller.js, ale szukałem options-modal.controller.js DOH!
— theFish

Mój był, ponieważ zapomniałem dodać .js w BundleConfig. Proste, ale frustrujące.
— Ege Bayrak

4

Napotkałem ten sam problem iw moim przypadku stało się to w wyniku tego problemu:

Miałem kontrolery zdefiniowane w oddzielnym module (zwanym „myApp.controllers”) i wstrzyknięte do głównego modułu aplikacji (zwanego „myApp”) w następujący sposób:

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

Kolega umieścił inny moduł kontrolera w oddzielnym pliku, ale o dokładnie takiej samej nazwie jak moja (tj. „MyApp.controllers”), który spowodował ten błąd. Myślę, że ponieważ Angular pomylił te moduły kontrolera. Jednak komunikat o błędzie nie był zbyt pomocny w odkrywaniu, co się dzieje.


1
Powinno to zostać naprawione poprzez usunięcie drugiego parametru w module ... Aby uzyskać istniejący moduł za pomocą angular.module („myApp”) bez drugiego parametru. tj. angular.module ('myApp'). contoller (...)
— Santhosh

3

W moim przypadku (mając stronę przeglądu i stronę „dodaj”) otrzymałem to z moją konfiguracją routingu, jak poniżej. Podawał komunikat dla AddCtrl, którego nie można było wstrzyknąć ...

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

Z powodu when('/' trasy wszystkie moje trasy przeszły do ​​przeglądu i nie można było dopasować kontrolera do renderowania strony / add route. To było mylące, ponieważ widziałem szablon add.html, ale nigdzie nie można było znaleźć jego kontrolera.

Usunięcie trasy „/”, gdy sprawa rozwiązało ten problem.


Otrzymałem również ten błąd i wyrywałem sobie włosy, ponieważ powodował niepowodzenie moich kompilacji TFS. Skomentowanie trasy „/” również rozwiązało problem. Teraz, aby dowiedzieć się, dlaczego!
— Phillip Copley

3

Jeśli jesteś w module podrzędnym, nie zapomnij zadeklarować modułu w głównej aplikacji. tj .:

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

Jeśli nie zadeklarujesz subModule1 w mainApp, otrzymasz argument "[ng: areq]" MyController "nie jest funkcją, został zdefiniowany.


2

Drugim punktem Уmeda była moja pułapka, ale tak dla porządku, może to gdzieś pomaga:

Miałem ten sam problem i tuż przed tym, jak oszalałem, odkryłem, że zapomniałem dołączyć skrypt kontrolera.

Ponieważ moja aplikacja jest oparta na ASP.Net MVC, postanowiłem zachować rozsądek, wstawiając następujący fragment kodu do mojego App_Start / BundleConfig.cs

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

oraz w Layout.cshtml

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

Teraz już nigdy więcej nie będę musiał myśleć o ręcznym dołączaniu plików. Z perspektywy czasu naprawdę powinienem był to zrobić podczas przygotowywania projektu ...


1

Otrzymałem rozsądny błąd z LoginController, którego użyłem w głównym pliku index.html. Znalazłem dwa sposoby rozwiązania:

  1. ustawiając $ controllerProvider.allowGlobals (), znalazłem ten komentarz w liście zmian Angular "ta opcja może być przydatna do migracji starych aplikacji, ale nie używaj jej w nowych!" oryginalny komentarz do Angular

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

  2. zły konstruktor rejestrującego kontrolera

przed

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

teraz

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

„app” pochodzi z pliku app.js

var MyApp = {};
var app = angular.module('MyApp ', ['app.services']);
var services = angular.module('app.services', ['ngResource', 'ngCookies', 'ngAnimate', 'ngRoute']);

1

Miałem ten sam błąd z dużym błędem:

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

}]);

Zobaczysz ? zapomniałem '' wokół pierwszego zakresu $, prawidłowa składnia to oczywiście:

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

}]);

Pierwszy błąd, którego nie widziałem od razu, to: „ $ scope nie jest zdefiniowany ”, po którym następuje „ Błąd: [ng: areq] Argument 'TreeEditStepControlsCtrl' nie jest funkcją, jest niezdefiniowany ”


0

Czy mogłoby to być tak proste, jak umieszczenie aktywów w „” i cokolwiek wymaga cudzysłowu w środku z „”?

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

staje się

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

Może to powodować problemy z analizowaniem


0

Aby rozwiązać ten problem, musiałem odkryć, że błędnie wpisałem nazwę kontrolera w deklaracji tras Angular:

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

0

W moim przypadku była to prosta literówka w index.html:

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

to powinno być

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

bez dodatku sw nazwie kontrolera.


0

Okazuje się, że jest to pamięć podręczna przeglądarki, używając tutaj Chrome. Po prostu zaznacz opcję „Wyłącz pamięć podręczną” w obszarze Sprawdź (element), aby rozwiązać mój problem.


0

Ponieważ ten komunikat pojawia się w Google podczas próby znalezienia odpowiedzi na: „Błąd: Argument” nie jest funkcją, została zdefiniowana ”.

Możliwe, że próbujesz dwukrotnie utworzyć ten sam moduł.

Angular.module to globalne miejsce do tworzenia, rejestrowania i pobierania modułów AngularJS.

Przekazanie jednego argumentu powoduje pobranie istniejącego kąta. Moduł, natomiast przekazanie więcej niż jednego argumentu tworzy nowy kąt.

Źródło: https://docs.angularjs.org/api/ng/function/angular.module#overview

Przykład:

angular.module('myApp', []) Służy do tworzenia modułu bez wprowadzania żadnych zależności.

angular.module('myApp') (Bez argumentu) służy do pobrania istniejącego modułu.


0

Wydaje się, że istnieje wiele działających rozwiązań sugerujących, że błąd ma wiele rzeczywistych przyczyn .

W moim przypadku nie zadeklarowałem administratora w app/index.html:

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

Błąd zniknął.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.