我是AngularJS的新手并且学习了两种编写控制器函数的方式。似乎有人不使用显式注释的唯一原因是节省时间,这似乎不是一个好理由。并且能够缩小/混淆代码似乎是我想要在任何应用程序中保留的要求。
另请注意,我不是问哪个更好还是要求辩论。我问的是什么原因(或在什么情况下)不使用显式注释会更有益。
我在谈论的例子:
module('myApp').controller('MyController', function($scope) {});
VS
module('myApp').controller('MyController', ['$scope', function($scope) {}]);
答案 0 :(得分:6)
inline array annotation 只是一个关于Javascript限制的解决方法,允许Angular代码缩小而不是停止工作。但它并不是一个很好的解决方案,因为如果强迫您复制您的代码。我们都知道重复代码有多糟糕。 Angular文档本身承认:
使用此类注释时,请注意保留注释 数组与函数声明中的参数同步。
添加新依赖项并忘记添加相应的注释太容易了。或者重新排序参数并忘记更新注释列表。相信我。去过也做过。
幸运的是,智能人员开发的工具可以通过自动注释代码来减轻负担。可能最知名的是ng-annotate,正如@pankajparkar所提到的那样。您所要做的就是将其插入构建过程中,并且您的代码将被正确注释。
说实话,我发现Angular文档建议不要采用这种方法,这真的很奇怪。
答案 1 :(得分:4)
显然你在进行JS缩小时需要DI的数组注释, 如果您不想缩小JS文件,那么您可以继续 功能模式。
Refer this Article对你想要的东西有很好的解释。
如果您不想包含依赖注入的数组注释,那么您只需使用ng-annotate库。 (正如你所说,它的不错模式认为你可以通过ng-annotate
来避免它
在缩小js文件的同时将代码转换为DI的数组注释
只有您需要在声明ng-strict-di
指令的地方添加ng-app
属性。
<div ng-app="myApp" ng-strict-di>
答案 2 :(得分:0)
使用直接参数
当您将参数传递给控制器函数时,在此机制中,您将传递参数,而角度将识别
实施例。
module('myApp').controller('MyController', function($scope) {});
module('myApp').controller('MyController', function($scope,$http) {});
OR
module('myApp').controller('MyController', function($http,$scope) {});
在第二个和第三个示例中,$ scope和$ http的位置不同,但它们可以正常工作。这意味着角度识别哪个是$ scope,哪个是$ http。
现在考虑您开发了一个Web应用程序,并且您将要部署它。在部署之前,将缩小您的javascript代码以减小js文件的大小。 在缩小过程中,每个变量都会缩短,就像$ scope可能变为a,而angular不能识别'a'。
使用数组方法
这是标准机制,当您传递数组时,数组元素是除最后一个元素之外的字符串,最后一个数组元素是您的控制器函数。 您必须将数组中每个参数的顺序指定为字符串,并且您可以在函数中传递该变量,在这里您可以提供任何变量名称,因为它们只是别名。
离。
module('myApp').controller('MyController', ['$scope',function($scope) {}]);
module('myApp').controller('MyController', ['$scope','$http',function(myscope,newhttp) {}]);
现在在这个机制中,如果你使用任何缩小器来缩小这个js,它会缩小并将myscope改为任何其他名称'b',但它不会触及$ scope,因为它是一个字符串,你不需要担心因为b只是$ scope的别名。
这是推荐的,但如果您使用grunt / gulp进行缩小,可以查看这些
答案 3 :(得分:0)
我认为,如果您不希望任何人缩小您的应用程序代码,那么使用注释会有用且确实有必要的一种情况。
答案 4 :(得分:0)
唯一真正的原因是在模拟应用程序时速度更快。
这是Angular早期的一个遗留物,当时他们有一些用于炫耀&#39;制作Angular应用程序是多么容易。另一个例子是Angular如何查找在window
上全局声明的控制器;他们删除了这个功能&#39;在1.3。 This changelog最能解释原因。
这是一个有趣的小噱头,它有助于新开发人员进入Angular世界,但没有充分的理由在生产应用程序中使用它。