我已经在Angular中编写了一段时间的编码,到目前为止我已经创建了模块,控制器和服务,但我最近遇到了一段我无法理解的代码。这是别人的代码,我认为作者试图定义一个服务但不像我创建的那样。通常,当我创建服务时,它看起来如下所示:
app.factory('portabilityService', [
'$resource', '$state', '$rootScope', function ($resource, $state, $rootScope) {
return { //definition };
}
]);
现在,我遇到了一些其他代码,如下所示:
(function () {
/*
* Manages which samples have been selected
*/
'use strict';
angular.module('maintenance.portability.module')
.factory('selectedSamplesSvc', service);
service.$inject = [];
function service()
{
//other function definitions
};
})();
现在,这提出了很多问题:
答案 0 :(得分:2)
所有答案归结为:它们与传递给.factory
的函数的等效定义相同。
$inject
是您[ names..., function(dependencies...) {...}]
语法$inject
有利于最小化关于此事的其他考虑因素(部分)和总体良好的阅读情况,请看style guide。
答案 1 :(得分:2)
我会尝试按顺序解决您的问题:
首先,是的,这绝对是一种声明服务的方式。它与您通常习惯使用的东西并不完全相同。
angular中声明的常规语法是:
typeOfDeclaration('stringNameOfDeclaration', functionDeclaration);
function functionDeclaration(){..};
在JavaScript中,函数是一个对象,因此可以使用匿名函数代替functionDeclaration
,例如:
typeOfDeclaration('stringNameOfDeclaration', function(){..});
当你只做一个声明时,这个内联声明通常更容易编写,并且是大多数教程示例的事实标准。
注意这些规则适用于所有角度组件(providers
,filters
,directives
,controllers
等等。)
通过将函数声明为单独的对象而不是内联,声明和函数更容易管理。理论上,您可以将函数本身放入不同的文件中(尽管这并不常见)。此外,如果您声明了多个函数,则此语法允许您将声明组合在一起并将函数组合在一起,这主要是首选项和编码样式。
示例中的 可选 依赖项数组是在代码缩小的情况下管理依赖注入的一种方法。在这种情况下,使用另一种替代DI方法service.$inject = [];
。可以使用此数组代替内联数组,即service.$inject = ['$resource', '$state', '$rootScope'];
同样,这为您提供了一种方法,可以将声明分组到一个位置,将依赖项分组到另一个位置。