谈谈AngularJS中的injector
发布在用Angular开发web应用2014年3月5日view:15195
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

enter image description here

大多数的AngularJS用户可能从来都不会使用AngularJS中的$injector service知道在依赖注入时出现了问题,这是我们就会看到如下所示的错误信息:

Uncaught Error: [$injector:unpr] Unknown provider: someServiceProvider <- someService   

AngularJS中的$injector知道怎样通过分析函数的依赖来调用函数,以及通过获取适当的service实体来传递正确的参数。在引导启动时,AngularJS创建了一个$injector,并且使用这个$injector来调用控制器函数,service函数,filter函数,以及其他可能需要依赖作为参数的函数。

如果一个函数要求一个叫做“someService”的service,但是“someService”并不是一个service时,上述的错误可能会出现,而injector知道这一点(因为,也许,该service没有正确的注册)。

就像其他的service一样,你可能会用到$inject,只需要在依赖中加上它的名字即可:

var someFunction = function($rootScope,$http){
    return "called!";
};  

app.run(function($rootScope,$injector){
    $rootScope.annotations = $injector.annotate(someFunction);
    $rootScope.message = $injector.invoke(someFunction);
});  

上面的代码展示了$injector的两个作用:

  1. 你可以使用annotate API来发现一个依赖注释作为一个可注入函数(上面的代码会将”$rotScope”和”$http”作为注释)
  2. 你可以使用invike API来执行一个可注入函数并且将这个$injector传递到适当的service中。

手动注入

在某些情形中你会发现你想要创建你自己的$injector而不是使用AngularJS在引导启动时自动创建的$injector。例如,在你不想要单体service实例的单元测试中,创建一个你自己的injector是很有用的。你可以使用angular.injector方法来创建一个你自己的injector。

var injector = angular.injector(["ng"]);

var someFunction = function($http){
    //...
};

injector.invoke(someFunction);   

你需要传递一个module列表(在上面的例子中仅仅只有核心的”ng”module)。如果你需要私用Angular核心中的任何service的话你必须显式的指明ng module。angular.module方法会假设你对ng module有依赖,并会悄悄的为你的依赖列表添加”ng”,而injector函数对于依赖module则不会做任何的假设。


本文译自Meet The AngularJS Injector,原文地址http://odetocode.com/blogs/scott/archive/2014/01/13/meet-the-angularjs-injector.aspx

如果你觉得本文对你有帮助,请点击为我提供赞助

评论
发表评论
4年前
添加了一枚【评注】:invike 应该为 invoke
WRITTEN BY
张小俊128
Intern in Baidu mobile search department。认真工作,努力钻研,期待未来更多可能。
TA的新浪微博
PUBLISHED IN
用Angular开发web应用

讲述Angular开发框架的基础知识,帮助读者快速学习并深入理解Angular的开发理念和具体应用方式

我的收藏