121 votes

Erreur : L'argument n'est pas une fonction, il est devenu indéfini.

En utilisant AngularJS avec Scala Play, j'obtiens cette erreur.

Erreur : L'argument 'MainCtrl' n'est pas une fonction, il est devenu indéfini.

J'essaie de créer un tableau composé des jours de la semaine.

Jetez un coup d'œil à mon code. J'avais vérifié le nom du contrôleur, mais cela semble correct. Note : Le code utilisé provient de ce SO réponse

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 votes

Dans les html où vous avez utilisé ng-app pouvez-vous le changer en ng-app=myApp

0 votes

J'ai la même erreur @Chandermani

0 votes

Avez-vous essayé de supprimer la fermeture (IIFE) du code ? Lorsque j'ai eu ce problème, c'était parce que j'avais une erreur PHP dans mon javascript.

108voto

Chandermani Points 19000

Retirer le [] à partir du nom ([myApp]) du module

angular.module('myApp', [])

Et ajoutez ng-app="myApp" au html et cela devrait fonctionner.

1 votes

Tout ce que j'ai dû faire pour que ça fonctionne, c'est la deuxième suggestion (c'est-à-dire set ng-app="myApp"). Si je supprimais les [], j'obtenais une autre erreur.

15 votes

Ayant le deuxième paramètre [] indique que vous créez un nouveau module. La suppression du deuxième paramètre indique que vous récupérez un module existant. Il est donc possible de vérifier si vous faites appel à angular.module deux fois, les deux fois incluant le second paramètre. Si c'est le cas, la dernière occurrence écrasera la seconde, masquant toute définition des contrôleurs jusqu'à ce point.

26 votes

Quand il dit d'enlever le [] il fait référence au premier paramètre où le PO a [myApp] au lieu de myApp . Il ne parle pas du deuxième paramètre.

78voto

Уmed Points 3410

PREMIER. vérifiez si vous avez la bonne controller dans les définitions de route, comme les noms des contrôleurs que vous définissez.

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

des noms de contrôleurs différents dans cet exemple conduiront à des erreurs, mais cet exemple est correct

SECOND vérifiez si vous avez importé votre fichier javascript :

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

31 votes

D'après mon expérience, c'est toujours votre "deuxième" qui pose problème. J'oublie souvent d'importer mes contrôleurs dans index.html

0 votes

C'était le deuxième dans mon cas aussi, j'ai oublié d'importer le fichier JS...

26voto

bertrand Points 81

J'ai eu le même message d'erreur (dans mon cas : "Argument 'languageSelectorCtrl' is not a function, got undefined").

Après une comparaison fastidieuse avec le code d'Angular seed, j'ai découvert que j'avais précédemment supprimé une référence au module controllers dans app.js. (repérez-le à https://github.com/angular/angular-seed/blob/master/app/js/app.js )

Donc j'avais ça :

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

Ça a échoué.

Et quand j'ai ajouté la référence manquante :

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

Le message d'erreur a disparu et Angular a pu à nouveau instancier les contrôleurs.

0 votes

J'ai eu le même problème, mon problème était que j'avais oublié d'ajouter mon contrôleur au module d'application... pourquoi cela ne se fait-il pas automatiquement ??? merci quand même !

16voto

Gaurav Points 29

Parfois, cette erreur est due à deux ng-app spécifiées dans le html. Dans mon cas, par erreur, j'avais spécifié ng-app dans mon html et ng-app="myApp" dans le body une étiquette comme celle-ci :

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

1 votes

Cela m'est arrivé lorsque je n'ai pas ajouté l'injection au module myApp.

0 votes

Merci ! Cela a réglé mon problème.

4voto

Lilla Eli Points 1

J'ai rencontré le même problème et dans mon cas, c'est le résultat de ce problème :

Les contrôleurs sont définis dans un module séparé (appelé 'myApp.controllers') et injectés dans le module principal de l'application (appelé 'myApp') comme ceci :

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

Un collègue a ajouté un autre module de contrôle dans un fichier distinct, mais avec le même nom que le mien (c'est-à-dire 'myApp.controllers'), ce qui a provoqué cette erreur. Je pense qu'Angular a confondu ces deux modules de contrôleurs. Cependant, le message d'erreur n'a pas été très utile pour découvrir ce qui ne va pas.

1 votes

Cela devrait être corrigé en supprimant le deuxième paramètre dans le module... Pour obtenir le module existant en utilisant angular.module('myApp') sans le deuxième paramètre. c'est-à-dire angular.module('myApp').contoller(...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X