我在其网站上关注the AngularJS tutorial,此时我的控制器如下,页面加载完美:
var phonecatApp = angular.module('phonecatApp', []);
phonecatApp.controller('PhoneListCtrl', function($scope, $http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
});
正如我正在做的那样"关于缩小的注意事项"第5步的一部分,我提出了这个:
var phonecatApp = angular.module('phonecatApp', []);
function PhoneListCtrl($scope, $http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
}
//phonecatApp.controller('PhoneListCtrl', ['$scope', '$http', PhoneListCtrl]);
页面加载第二个代码就好了,我从模块中注释了控制器的创建。我的问题是,从模块声明控制器和定义函数
之间的区别是什么答案 0 :(得分:4)
实际执行/行为没有区别,第二个是使用称为' function constructor'的东西。这是在javascript中创建类似类结构的常用方法。
引擎盖下的第一个将做同样的事情,只是那个角度很快。依赖注入模型使用字符串,因此更容易阅读。
答案 1 :(得分:1)
声明全局功能,AFAIK是可能的,以简化简单的演示并快速加快速度。在最新版本的Angular中,默认情况下不再支持它(请参阅https://github.com/angular/angular.js/commit/3f2232b5a181512fac23775b1df4a6ebda67d018)。
无论如何,使用大量功能污染全局命名空间都是不好的做法。答案 2 :(得分:1)
查看Todd Motto的角度样式指南:http://toddmotto.com/opinionated-angular-js-styleguide-for-teams/
将控制器定义为函数表达式对于保持代码DRY并允许命名堆栈跟踪非常重要:
这没关系:
function PhoneListCtrl($scope, $http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
}
问题在于这将功能置于全球范围内; ohhh nooo 。解决方案是将声明包装在IIFE中。这使您可以保持定义功能的最佳实践,并且不会污染全局范围。
以下是一个例子:
(function () {
angular.module('app', []);
// MainCtrl.js
function MainCtrl () {
}
angular
.module('app')
.controller('MainCtrl', MainCtrl);
// AnotherCtrl.js
function AnotherCtrl () {
}
angular
.module('app')
.controller('AnotherCtrl', AnotherCtrl);
// and so on...
})();
答案 3 :(得分:0)
像这样:
function PhoneListCtrl($scope, $http) {
您的函数将在global
范围内声明。
我们知道污染全球范围显然是不好的,因为它可能导致变量/功能冲突。
通过将其包装在控制器中,可以隔离范围。