有三种方法可以注释函数的依赖关系:
第一个是:参数名称明确且准确:
app.controller('ACtrl', function($scope, $http, $q) {
//your stuff here
});
这意味着该函数的参数名称必须与已注册的服务/提供商的名称相匹配。Caveat:如果你缩小文件(丑化,以节省空间),你将丢失参数名称,因此它将被破坏 - 将不起作用(会抱怨)。
第二个允许您选择要作为字符串文字注入的服务名称(因为字符串文字是一个值,所以它永远不会缩小):
var myfunc = function($s, $http, $q) {
//do your stuff here
};
myfunc.$inject = ['$scope', '$http', '$q'];
app.controller('ACtrl', myfunc);
这使得 Angular 读取函数的 $inject 属性,并且不按名称匹配形式参数,而是按同一数组位置中的值匹配。因此,即使您缩小文件,$scope 也会在 $s 中。如果函数中不存在 $inject,那么您将回到第一种情况(不推荐)。
第三个与第二个类似(即它将通过字符串指定依赖项并抵抗丑陋的化):
var myfunc = function($s, $http, $q) {
//do your stuff here
}
app.controller('ACtrl', ['$scope', '$http', '$q', myfunc]);
请注意数组的最后一个元素是要调用的函数。看起来有点令人毛骨悚然,但它是一致的。 Angular 是这样做的:如果控制器是一个数组,则弹出最后一个元素 - 它将是函数。前一个元素(剩余的数组)受到威胁,就好像它们是$inject
函数中的值。
控制器和提供程序必须有一个名称来引用它们 - 我使用“ACtrl”作为控制器的名称。它不是函数的名称,而是在依赖注入(对于提供者)和 ngRoute(对于控制器)之类的东西中使用的内部名称。
声明名称是第一个边界wiring你在要求。在依赖注入的三种形式中的任何一种中使用它们是这种依赖注入的第二个纽带wiring.
Remember: AdvancedGithubUser
是注册提供商,原样$http
。唯一的区别是$http
是 Angular 内置的,而 AdvancedGithubUser 不是。美元符号开头的符号应该保留给 Angular,但这不是必需的 - 只是一个很好的做法。AdvancedGithubUser
是通过以下内容创建的(在外部模块中):
app.service('AdvancedGithubUser', AdvancedGithubUser);
//being AdvancedGithubUser a constructor.