Como encontrar uma razão AngularJS “Argumento ‘MyCtrl’ não é uma function, ficou indefinido”

Quando o AngularJS trava com um erro ” Argumento ‘MyCtrl’ não é uma function, ficou indefinido ” pode ser um pouco difícil encontrar um motivo.

Aqui eu quero fazer uma espécie de “check list”, o que você deve verificar quando recebeu um erro

  1. O arquivo com ‘MyCtrl’ está conectado via html ? (marque duas vezes se você concat ou uglify seus arquivos)
 
  1. O ‘MyCtrl’ está definido corretamente ?

Existem alguns padrões:

 app.controller('MyCtrl', ['$scope', function ($scope) {...}]) app.controller('MyCtrl', function ($scope) {...}) var MyCtrl = function ($scope) {...}) 
  1. É ‘MyCtrl’ definido no módulo da direita?
  2. O módulo “MyCtrl’s” é adicionado às dependencies do aplicativo ?
 angular.module('app', ['app.sources']); 
  1. Se você definir seu módulo várias vezes, você deve defini-lo nesta ordem :

    • Primeiro definir deve ser como
 angular.module('app.sources', []); 

(com [ ] )

  • Posterior define deve ser como
 angular.module('app.sources'); 

(sem [ ] )

Importante : A ordem de declaração é importante – a definição com [ ] deve ser a primeira.

  1. Verifique se o módulo está definido apenas uma vez . Você pode ter esquecido de renomear o módulo após copiar e colar. Verifique src para string como
 angular.module('app.sources', []); 
  1. Verifique seu 'ng-app' . É melhor usar apenas um desses com nome como ng-app='app' (em outras palavras, não defina várias diretivas ngApp sem nome)

  2. A syntax do seu controlador está correta para a sua versão do AngularJS ?

(Há uma diferença entre a definição em Angular 1.0.xe 1.2.xe superior. Com versões Angulares maiores que 1.3.x , você não pode declarar uma function construtora global e usá-la com ng-controller)

Se você estiver usando o ng-controller com a syntax “controller as”, certifique-se de verificar se o nome do controlador está correto.

O meu caso:

 //controller register angular.module("myApp").controller("someController", SomeController) //in my code 

Repare que eu usei ng-controller="SomeController as vm" , onde SomeController tem um S maiúsculo. Deveria ter sido com um s minúsculo porque foi assim que o registrei.

Portanto, verifique se o nome do seu controlador está correto.