Erro: o argumento não é uma função, foi indefinido


120

Usando o AngularJS com o Scala Play, estou recebendo esse erro.

Erro: o argumento 'MainCtrl' não é uma função, foi indefinido

Estou tentando criar uma tabela composta pelos dias da semana.

Por favor, dê uma olhada no meu código. Eu verifiquei o nome do controlador, mas isso parece correto. Nota: Código usado nesta resposta do 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
Em html onde você usou ng-appvocê pode alterá-lo parang-app=myApp
— Chandermani

Tenho o mesmo erro @Chandermani
— Kevin Meredith

Você tentou remover o fechamento (IIFE) do código? Quando tive esse problema, foi porque havia um erro de PHP no meu javascript.
— Kevin Beal

1
Você pode descobrir o seu problema, por esta lista de verificação: stackoverflow.com/a/26797874/930170
— Sergei Panfilov

Confirme se você adicionou MainCtrl.controller.js ao arquivo BundleConfig.cs
— Syed Mohamed

Respostas:


107

Remova o []do nome ([myApp]) do módulo

angular.module('myApp', [])

E adicione ng-app="myApp"ao html e deve funcionar.


1
Tudo o que eu precisava fazer para funcionar era a segunda sugestão (ou seja, configure ng-app = "myApp"). Se eu removi o [], recebi outro erro.
— Jason

15
Ter o segundo parâmetro []indica que você está criando um novo módulo. A remoção do segundo parâmetro indica que você está recuperando um módulo existente. Portanto, uma possibilidade de verificar é se você está chamando angular.moduleduas vezes, incluindo o segundo parâmetro. Nesse caso, a ocorrência posterior substituirá a segunda, ocultando quaisquer definições de controladores até esse ponto.
— 22713 Carl Carl G

26
Quando ele diz para remover o []que ele está se referindo ao primeiro parâmetro onde o OP tem [myApp]em vez de myApp. Ele não está falando sobre o segundo parâmetro.
— Kevin Beal

1
Verifique o nome do seu controlador se você estiver usando rotas. O nome do controlador na definição de rota faz distinção entre maiúsculas e minúsculas.
— Latin Warrior

78

PRIMEIRO. verifique se você está correto controllernas definições de rota, o mesmo que os nomes dos controladores que você está definindo

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

nomes de controladores diferentes neste exemplo levarão a erros, mas este exemplo está correto

SEGUNDO, verifique se você importou seu arquivo javascript:

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


30
Na minha experiência, seu "segundo" é sempre o problema. Costumo esquecer de importar meus controladores paraindex.html
— msanford

Foi o segundo no meu caso também, esqueci de importar o arquivo JS ...
— Saurabh Misra

26

Eu tive a mesma mensagem de erro (no meu caso: "O argumento 'languageSelectorCtrl' não é uma função, ficou indefinido").

Após uma comparação tediosa com o código da semente Angular, descobri que havia anteriormente removido uma referência ao módulo de controladores no app.js. (localize-o em https://github.com/angular/angular-seed/blob/master/app/js/app.js )

Então eu tive isso:

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

Isso falhou.

E quando adicionei a referência ausente:

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

A mensagem de erro desapareceu e o Angular pode instanciar os controladores novamente.


teve o mesmo problema, meu problema foi que esqueci de adicionar meu controlador ao módulo de aplicativo ... por que isso não acontece automaticamente ??? obrigado de qualquer maneira!
— TheZuck

16

Algumas vezes, esse erro é resultado de duas ng-app diretivas especificadas no html. No meu caso, por engano, eu especifiquei ng-appna minha htmltag e ng-app="myApp"na bodytag assim:

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

1
Aconteceu comigo quando eu não adicionei a injeção no módulo myApp.
— Ghandhikus

Obrigado! Isso corrigiu meu problema.
— 22716 Bradden_gross

6

Isso levou-me a sério 4 HORAS (incluindo pesquisas intermináveis ​​no SO), mas finalmente encontrei: por engano (sem querer), adicionei um espaço em algum lugar.

Você consegue identificar?

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

Então ... 4 horas depois, vi que deveria ser:

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

Quase impossível de ver apenas a olho nu.

Isso enfatiza a importância vital do controle de revisão (git ou qualquer outra coisa) e dos testes de unidade / regressão.


1
Minha resposta não foi um espaço extra, mas me levou à minha solução. Eu tinha em Controllervez disso controllere foi tudo o que foi preciso.
— Grandizer 26/10/2015

E nomeei meu arquivo de opções-moda.controller.js, mas estava procurando por opções-modal.controller.js DOH!
— theFish 23/10

O meu foi por causa de eu esqueci de adicionar .js no BundleConfig. Simples, mas frustrante.
— Ege Bayrak

4

Eu encontrei o mesmo problema e, no meu caso, estava acontecendo como resultado desse problema:

Eu tinha os controladores definidos em um módulo separado (chamado 'myApp.controllers') e injetado no módulo principal do aplicativo (chamado 'myApp') assim:

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

Um colega enviou outro módulo do controlador em um arquivo separado, mas com exatamente o mesmo nome que o meu (por exemplo, 'myApp.controllers') que causou esse erro. Eu acho que porque o Angular ficou confuso entre esses módulos do controlador. No entanto, a mensagem de erro não foi muito útil para descobrir o que está acontecendo de errado.


1
Isso deve ser corrigido removendo o segundo parâmetro no módulo ... Para obter o módulo existente usando angular.module ('myApp') sem o segundo parâmetro. ou seja, angular.module ('myApp'). contoller (...)
— Santhosh

3

No meu caso (com uma página de visão geral e uma página "adicionar"), compreendi isso com minha configuração de roteamento, como abaixo. Estava dando a mensagem para o AddCtrl que não pôde ser injetado ...

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

Por causa da when('/'rota, todas as minhas rotas foram para a visão geral e o controlador não pôde ser correspondido na renderização de página de rota / add. Isso foi confuso porque eu vi o modelo add.html, mas seu controlador não estava em lugar nenhum.

A remoção da rota '/' - quando o caso corrigiu esse problema para mim.


Eu também estava recebendo esse erro e arrancando os cabelos porque estava causando falhas nas compilações do TFS. Comentar a rota '/' também a corrigiu. Agora, para descobrir o porquê!
— Phillip Copley

3

Se você estiver em um submódulo, não se esqueça de declarar o módulo no aplicativo principal. ou seja:

<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 você não declarar subModule1 no mainApp, receberá um argumento "[ng: areq]" MyController "não é uma função, ficará indefinido.


2

O segundo ponto de Уmed foi minha armadilha, mas apenas para constar, talvez esteja ajudando alguém em algum lugar:

Eu tinha o mesmo problema e, pouco antes de enlouquecer, descobri que havia esquecido de incluir meu script de controlador.

Como meu aplicativo é baseado no ASP.Net MVC, decidi me manter saudável, inserindo o seguinte trecho no meu App_Start / BundleConfig.cs

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

e no Layout.cshtml

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

Agora não precisarei pensar em incluir os arquivos manualmente novamente. Em retrospectiva, eu realmente deveria ter feito isso ao configurar o projeto ...


1

Eu obtive um erro sensato com o LoginController, que usei no principal index.html. Encontrei duas maneiras de resolver:

  1. definindo $ controllerProvider.allowGlobals (), descobri que, na lista de alterações angular , "essa opção pode ser útil para a migração de aplicativos antigos, mas não use em novos!" comentário original sobre Angular

    app.config (['$ controllerProvider', função ($ controllerProvider) {$ controllerProvider.allowGlobals ();}]);

  2. contratador errado do controlador de registro

antes

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

agora

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

'app' vem de app.js

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

1

Eu tive o mesmo erro com um grande erro:

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

}]);

Entende ? esqueci o '' em torno do primeiro escopo $, a sintaxe correta é claro:

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

}]);

Um primeiro erro que não vi imediatamente foi: " $ scope is not defined ", seguido por " Error: [ng: areq] O argumento 'TreeEditStepControlsCtrl' não é uma função, ficou indefinido "


0

Poderia ser tão simples quanto colocar seu ativo em "" e o que precisar de aspas por dentro com ''?

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

torna-se

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

Isso pode estar causando alguns problemas com a análise


0

Para corrigir esse problema, tive que descobrir que escrevia incorretamente o nome do controlador na declaração de rotas angulares:

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

0

No meu caso, foi um erro de digitação simples em index.html:

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

isso deveria ter sido

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

sem o extra sno nome do controlador.


0

Acontece que é o cache do navegador, usando o Chrome aqui. Basta verificar o "Desativar cache" em Inspecionar (elemento) resolvido meu problema.


0

Porque isso aparece no Google ao tentar encontrar uma resposta para: "Erro: argumento '' não é uma função, ficou indefinido".

É possível que você esteja tentando criar o mesmo módulo duas vezes.

O angular.module é um local global para criar, registrar e recuperar módulos AngularJS.

Passar um argumento recupera um angular.Module existente, enquanto passar mais de um argumento cria um novo angular.Module

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

Exemplo:

angular.module('myApp', []) É usado para criar um módulo sem injetar nenhuma dependência.

angular.module('myApp') (Sem argumento) é usado para obter um módulo existente.


0

Parece haver muitas soluções de trabalho sugerindo que o erro tem muitas causas reais .

No meu caso, não havia declarado o controlador em app/index.html:

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

Erro desaparecido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.