传递函数和数组作为AngularJS控制器之间的区别是什么?

5

这两种方式都可以工作,但是每种实现方法的实际区别是什么?我相信每种方法背后都有逻辑上的原因,我希望能够得到启示。

angular.module('app').controller('GeneralCtrl', 
    function($scope, $location, exampleService) {
        $scope.variable = exampleService.getExampleVariable();
    }        
);

angular.module('app').controller('GeneralCtrl', 
    ['$scope', '$location', 'exampleService', function($scope, $location, exampleService) {
        $scope.variable = exampleService.getExampleVariable();
    }]
);

这两者实际上有什么区别?何时使用它们有所不同?为什么?
答案:事实证明,后者可以进行缩小并且安全,因为缩小器会重命名参数名称,因此无法从它们的名称推断依赖关系,必须进行注释。

2
区别在于代码的缩小。 - AlwaysALearner
那是唯一的区别吗? - Adam K Dean
阅读 DI http://docs.angularjs.org/guide/di - Chandermani
2
据我所知,后者是安全的代码压缩。 - AlwaysALearner
1个回答

4
这就是Angular所谓的"内联表示法"依赖注入(请参见http://docs.angularjs.org/guide/di获取更多详细信息)。
在你提供的示例中,实际上是ng-controller指令在幕后完成了工作,将$scope$locationexampleService连接到你提供给第一个function的变量中。它默认根据变量名称执行此操作(也就是说,假设名为$scope的变量正在请求$scope依赖项)。
话虽如此,当你压缩代码时,变量名称也会被缩短(例如,$scope可能变成a)。当发生这种情况时,Angular现在不再知道你的变量意味着什么了。
一种选择是添加
GeneralCtl.$inject('$scope', '$location', 'exampleService')

另一种方法是像第二个示例中所做的那样提供这些字符串。这可以确保即使变量名称被改变,您也告诉Angular它们应该代表什么,并且它知道如何正确设置它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接