Errore: l'argomento non è una funzione, non è stato definito


120

Utilizzando AngularJS con Scala Play, ricevo questo errore.

Errore: l'argomento "MainCtrl" non è una funzione, non è stato definito

Sto cercando di creare una tabella composta dai giorni della settimana.

Dai un'occhiata al mio codice. Avevo controllato il nome del controller, ma sembra corretto. Nota: codice utilizzato da questa risposta 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
In html dove hai usato ng-apppuoi cambiarlo inng-app=myApp
Chandermani

Ho ricevuto lo stesso errore @Chandermani
Kevin Meredith

Hai provato a rimuovere la chiusura (IIFE) dal codice? Quando ho avuto questo problema, è stato perché avevo un errore PHP nel mio javascript.
Kevin Beal

1
Puoi scoprire il tuo problema, da questo elenco di controllo: stackoverflow.com/a/26797874/930170
Sergei Panfilov

Conferma di aver aggiunto MainCtrl.controller.js nel file BundleConfig.cs
Syed Mohamed

Risposte:


107

Rimuovere il []dal nome ([myApp]) del modulo

angular.module('myApp', [])

E aggiungilo ng-app="myApp"all'html e dovrebbe funzionare.


1
Tutto quello che dovevo fare per farlo funzionare era il secondo suggerimento (es. Impostare ng-app = "myApp"). Se ho rimosso [], ho ricevuto un altro errore.
Jason

15
Avere il secondo parametro []indica che stai creando un nuovo modulo. La rimozione del secondo parametro indica che stai recuperando un modulo esistente. Quindi una possibilità per controllare è se stai chiamando angular.moduledue volte, entrambe le volte includendo il secondo parametro. In tal caso, la ricorrenza successiva sovrascriverà la seconda, nascondendo qualsiasi definizione di controller fino a quel punto.
Carl G

26
Quando dice di rimuovere il []si riferisce al primo parametro in cui ha l'OP [myApp]invece di myApp. Non sta parlando del secondo parametro.
Kevin Beal

1
Controlla il nome del tuo controller se stai usando percorsi. Il nome del controller nella definizione del percorso fa distinzione tra maiuscole e minuscole.
Latin Warrior

78

PRIMO. controlla di aver corretto controllernelle definizioni del percorso, lo stesso dei nomi dei controller che stai definendo

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

nomi di controller diversi in questo esempio porteranno a errori, ma questo esempio è corretto

SECONDO controlla se hai importato il tuo file javascript:

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


30
Nella mia esperienza, il tuo "secondo" è sempre il problema. Spesso dimentico di importare i miei controller inindex.html
msanford

Era la seconda anche nel mio caso, ho dimenticato di importare il file JS ...
Saurabh Misra

26

Ho ricevuto lo stesso messaggio di errore (nel mio caso: "L'argomento 'languageSelectorCtrl' non è una funzione, non è stato definito").

Dopo un noioso confronto con il codice di Angular seed, ho scoperto di aver precedentemente rimosso un riferimento al modulo controller in app.js. (individualo su https://github.com/angular/angular-seed/blob/master/app/js/app.js )

Quindi ho avuto questo:

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

Questo non è riuscito.

E quando ho aggiunto il riferimento mancante:

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

Il messaggio di errore è scomparso e Angular ha potuto instanciare nuovamente i controller.


ha avuto lo stesso problema, il mio problema era che ho dimenticato di aggiungere il mio controller al modulo dell'app ... perché questo non avviene automaticamente ??? grazie comunque!
TheZuck

16

Alcune volte questo errore è il risultato di due ng-app direttive specificate nell'html. Nel mio caso per errore avevo specificato ng-appnel mio htmltag e ng-app="myApp"nel bodytag in questo modo:

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

1
Mi è successo quando non ho aggiunto l'iniezione al modulo myApp.
Ghandhikus

Grazie! Questo ha risolto il mio problema.
bradden_gross

6

Questo mi ha preso sul serio 4 ORE (comprese infinite ricerche su SO) ma finalmente l'ho trovato: per errore (involontariamente) ho aggiunto uno spazio da qualche parte.

Riesci a individuarlo?

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

Quindi ... 4 ore dopo ho visto che dovrebbe essere:

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

Quasi impossibile da vedere solo ad occhio nudo.

Ciò sottolinea l'importanza vitale del controllo di revisione (git o altro) e dei test di unità / regressione.


1
La mia risposta non è stata uno spazio in più, ma mi ha portato alla mia soluzione. Avevo Controllerinvece controllere basta.
Grandizer

E ho chiamato il mio file options-moda.controller.js ma stavo cercando options-modal.controller.js DOH!
theFish

Il mio era perché ho dimenticato di aggiungere .js in BundleConfig. Semplice ma frustrante.
Ege Bayrak

4

Ho riscontrato lo stesso problema e nel mio caso stava accadendo a causa di questo problema:

Avevo i controller definiti in un modulo separato (chiamato 'myApp.controllers') e iniettati nel modulo principale dell'app (chiamato 'myApp') in questo modo:

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

Un collega ha inserito un altro modulo controller in un file separato ma con lo stesso identico nome del mio (cioè "myApp.controllers") che ha causato questo errore. Penso perché Angular si è confuso tra quei moduli controller. Tuttavia il messaggio di errore non è stato molto utile per scoprire cosa sta andando storto.


1
Questo dovrebbe essere risolto rimuovendo il secondo parametro nel modulo ... Per ottenere il modulo esistente usando angular.module ('miaApp') senza il secondo parametro. cioè angular.module ('miaApp'). controllore (...)
Santhosh

3

Nel mio caso (con una pagina panoramica e una pagina "aggiungi") ho ottenuto questo con la mia configurazione di routing come di seguito. Stava dando il messaggio per AddCtrl che non poteva essere iniettato ...

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

A causa del when('/'percorso, tutti i miei percorsi sono passati alla panoramica e non è stato possibile far corrispondere il controller nel rendering della pagina / aggiungi percorso. Questo è stato fonte di confusione perché ho visto il modello add.html ma il suo controller non si trovava da nessuna parte.

La rimozione del percorso "/" quando il caso ha risolto il problema per me.


Stavo ricevendo anche questo errore e mi stavo strappando i capelli perché stava causando il fallimento delle mie build TFS. Commentando il percorso "/" è stato risolto anche per me. Ora per capire perché!
Phillip Copley

3

Se ti trovi in ​​un sottomodulo, non dimenticare di dichiarare il modulo nell'app principale. cioè:

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

Se non dichiari subModule1 in mainApp, otterrai un "[ng: areq] Argomento" MyController "non è una funzione, non è stato definito.


2

Il secondo punto di Уmed era la mia trappola, ma solo per la cronaca, forse sta aiutando qualcuno da qualche parte:

Ho avuto lo stesso problema e appena prima di impazzire ho scoperto che avevo dimenticato di includere lo script del controller.

Poiché la mia app è basata su ASP.Net MVC, ho deciso di mantenermi sano inserendo il seguente frammento nel mio App_Start / BundleConfig.cs

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

e in Layout.cshtml

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

Ora non dovrò più pensare di includere i file manualmente. Col senno di poi avrei davvero dovuto farlo durante l'impostazione del progetto ...


1

Ho ricevuto un errore sano con LoginController, che ho usato in index.html principale. Ho trovato due modi per risolvere:

  1. impostando $ controllerProvider.allowGlobals (), ho trovato quel commento in Angular change-list "questa opzione potrebbe essere utile per migrare vecchie app, ma per favore non usarla in quelle nuove!" commento originale su Angular

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

  2. autore sbagliato della registrazione del controller

prima

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

adesso

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

"app" proviene da app.js

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

1

Ho avuto lo stesso errore con un grosso errore:

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

}]);

Vedi ? ho dimenticato il "" intorno al primo $ scope, la sintassi giusta è ovviamente:

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

}]);

Un primo errore che non ho visto immediatamente è stato: " $ scope non è definito ", seguito da " Errore: [ng: areq] L'argomento 'TreeEditStepControlsCtrl' non è una funzione, non è stato definito "


0

Potrebbe essere semplice come racchiudere la tua risorsa tra "" e tutto ciò che necessita di virgolette all'interno con ""?

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

diventa

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

Ciò potrebbe causare alcuni problemi con l'analisi


0

Per risolvere questo problema, ho dovuto scoprire di aver sbagliato a scrivere il nome del controller nella dichiarazione delle rotte angolari:

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

0

Nel mio caso è stato un semplice errore di battitura in index.html:

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

avrebbe dovuto essere

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

senza l'extra snel nome del controller.


0

Si scopre che è la cache del browser, usando Chrome qui. Basta controllare "Disabilita cache" in Inspect (Element) ha risolto il mio problema.


0

Perché questo viene visualizzato in Google quando si cerca di trovare una risposta a: "Errore: l'argomento" non è una funzione, non è stato definito ".

È possibile che tu stia cercando di creare lo stesso modulo due volte.

Angular.module è un luogo globale per la creazione, la registrazione e il recupero dei moduli AngularJS.

Il passaggio di un argomento recupera un angular.Module esistente, mentre il passaggio di più di un argomento crea un nuovo angular.Module

Fonte: https://docs.angularjs.org/api/ng/function/angular.module#overview

Esempio:

angular.module('myApp', []) Viene utilizzato per creare un modulo senza iniettare alcuna dipendenza.

angular.module('myApp') (Senza argomento) viene utilizzato per ottenere un modulo esistente.


0

Sembra che ci siano molte soluzioni funzionanti che suggeriscono che l'errore abbia molte cause reali .

Nel mio caso non avevo dichiarato il titolare del trattamento in app/index.html:

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

Errore andato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.