我学会了使用数组表示法编写所需的角度依赖关系,这样:
var app = angular.module('MyApp', []);
app.controller('MyCtrl', ['$scope', function($scope) {
$scope.stuff = 'stuff';
}]);
Angular文档遵循这种表示法,但我看到越来越多的教程不使用数组表示法,只是直接向控制器传递函数($ scope)。
两种方法之间有什么区别吗?或者可能在第二版中实现了一个?
答案 0 :(得分:3)
您应该使用数组表示法
明天说如果你想用uglify说缩小你的数据,它会缩小你的大变量名,但不会触及你的字符串所以你的陈述 来自
带有数组表示法的案例1
原始
app.controller('MyCtrl', ['$scope', function($scope) {
缩小的
x.controller('MyCtrl', ['$scope', function(a) {
控制器确切地知道变量a
是$scope
案例2没有数组表示法(如果您选择不使用它)
原始
app.controller('MyCtrl', function($scope) {
缩小的
x.controller('MyCtrl', function(a){
现在你的控制器不知道如何处理a
变量,而不是$scope
肯定
答案 1 :(得分:1)
如果您计划缩小代码,数组表示法很重要,无论如何您应该在生产中进行此操作。坚持使用它。
答案 2 :(得分:1)
如果您打算迷你应用程序,是的,您必须使用数组表示法。
这是因为变量已重命名,因此注入器不再知道您要注入的依赖项。
例如,如果在缩小时将$scope
重命名为a
则无效。
显然,这意味着您必须编写和维护更多代码。幸运的是,您可以在构建过程中自动执行此操作。
在我的项目中,我使用grunt和angular-templates。
答案 3 :(得分:0)
是的,有区别。我建议继续使用数组表示法,因为如果应用程序被缩小,不使用它将破坏您的依赖项引用。有关详细信息,请阅读https://docs.angularjs.org/tutorial/step_05。
答案 4 :(得分:0)
基本上你可以重命名变量而不影响注入的角度。正如其他人所说,专门用于缩小。
var app = angular.module('MyApp', []);
app.controller('MyCtrl', ['$scope', function(s) {
s.stuff = 'stuff';
}]);
答案 5 :(得分:0)
数组表示法用于注入依赖项。这两者之间的区别在于,如果你不包含数组符号意味着你不需要任何依赖。
最佳做法是使用[]表示法,以便您可以随时在应用程序中包含依赖项。
答案 6 :(得分:0)
简而言之,有两种方法可以在角度中使用依赖注入:隐式或显式。
隐含DI是.controller('MyCtrl', function(scope, dep1, dep2){
它不会给$ injector指示包含什么,它会做一些类似反射的东西来解决它。如果你缩小你的代码,它将变成
`.controller('MyCtrl', function(a, b, c){ `
这就是我们使用显式DI的原因。有几种方法可以这样做:
使用数组:.controller('MyCtrl', ['$scope','dep1','dep2', function($scope, dep1, dep2){
使用$inject
:
.controller('MyCtrl', myCtrl)
myCtrl.$inject = ['$scope', 'dep1', 'dep2']
function myCtrl($scope, dep1, dep2) {}
在两种方式中,即使minification将函数参数重命名为某个东西,$ injector也会知道它应该注入什么,因为它在字符串文字中有原始名称(不受缩小影响)
您还可以使用注释注释来告诉编译器/转换器如何处理角度DI,即它会将隐式DI转换为显式,请参阅here
我个人更喜欢.$inject
答案 7 :(得分:0)
DI可以帮助您缩小代码,其他答案也解释了DI注入技术的工作原理。基本上没有DI注入技术是坏的。
但我宁愿不要担心这件事,因为其他人会照顾这件事。使用ng-annotate
指令,这将使您能够直接在函数内使用依赖
如果你写了这样的代码
angular.module("MyMod").controller("MyCtrl", function($scope, $timeout) {
//awesome code here
});
当您将此代码发送到minifier时,它会在
时添加对角度组件的依赖关系的数组注释angular.module("MyMod").controller("MyCtrl", ["$scope", "$timeout",
function($scope, $timeout) {
//code here
}
]);
来自文档
ng-annotate
通过使用静态分析来识别公共代码 图案。有些模式它不会也永远不会理解 对于那些你可以使用显式ngInject注释的人,请参阅 进一步向下。