如何找到一个原因AngularJS"Argument'MyCtrl'不是一个函数,未定义"

Ser*_*lov 18 javascript angularjs

当AngularJS崩溃时出现错误" Argument'MyCtrl'不是函数,未定义 ",找到原因可能有点难度.

在这里,我想制作一种"检查清单",当出现错误时应该检查什么

Ser*_*lov 47

  1. 是否通过html连接'MyCtrl'文件?(如果你对文件进行连接或uglify,请检查两次)
<script src='path/to/controllers.js'></script>
Run Code Online (Sandbox Code Playgroud)
  1. 'MyCtrl'是否正确定义

有几种模式:

app.controller('MyCtrl', ['$scope', function ($scope) {...}])

app.controller('MyCtrl', function ($scope) {...})

var MyCtrl = function ($scope) {...})
Run Code Online (Sandbox Code Playgroud)
  1. "MyCtrl"是否在正确的模块中定义?
  2. "MyCtrl"模块是否已添加到应用程序依赖项
angular.module('app', ['app.sources']);
Run Code Online (Sandbox Code Playgroud)
  1. 如果你定义模块时间,您应该按以下顺序定义它:

    • 首先定义应该是
angular.module('app.sources', []);
Run Code Online (Sandbox Code Playgroud)

(带[ ])

  • 后续定义应该是这样的
angular.module('app.sources');
Run Code Online (Sandbox Code Playgroud)

(没有[ ])

重要:声明顺序很重要 - 定义[ ]应该先行.

  1. 检查模块是否仅定义一次.复制粘贴后,您可能忘记重命名模块.检查src是否有字符串
angular.module('app.sources', []);
Run Code Online (Sandbox Code Playgroud)
  1. 检查你的 'ng-app'.最好只使用其中一个名称ng-app='app'(换句话说,不要定义多个未命名的ngApp指令)

  2. 您的控制器语法是否适合您的AngularJS版本

(Angular 1.0.x1.2.x及更高版本中的定义之间存在差异.当Angular版本大于1.3.x时,您无法声明全局构造函数并将其与ng-controller一起使用)

  • 这节省了我的一天"使用Angular高于1.3.x,你不能声明一个全局构造函数并将其与ng-controller一起使用",谢谢 (4认同)