Angularjs 什么;“事物”;可以注入Angular.js中的其他文件中吗?

Angularjs 什么;“事物”;可以注入Angular.js中的其他文件中吗?,angularjs,dependency-injection,Angularjs,Dependency Injection,我很难理解Angular中的依赖注入。所以我的问题是,谁能解释一下,我们可以将哪些“类型”,比如控制器、工厂、提供者等注入到其他“类型”,包括相同“类型”的其他实例 我要找的是这张满是y/n的桌子。对于具有相同行/列的单元格,这意味着将一个“类型”的值注入另一个具有相同“类型”的值 我将更详细地介绍,而不是在表格中填写“是”和“否”,不做任何解释 太长了,读不下去了,这是……比我预期的要长一点。有一个TL;底部有DR,但我希望这证明是信息性的。[P/P> [此答案也已添加到AngularJS w

我很难理解Angular中的依赖注入。所以我的问题是,谁能解释一下,我们可以将哪些“类型”,比如控制器、工厂、提供者等注入到其他“类型”,包括相同“类型”的其他实例

我要找的是这张满是y/n的桌子。对于具有相同行/列的单元格,这意味着将一个“类型”的值注入另一个具有相同“类型”的值


我将更详细地介绍,而不是在表格中填写“是”和“否”,不做任何解释

太长了,读不下去了,这是……比我预期的要长一点。有一个TL;底部有DR,但我希望这证明是信息性的。[P/P> [此答案也已添加到AngularJS wiki:]


提供者()
$provide
服务负责告诉Angular如何创建新的可注入事物;这些东西被称为服务。服务由称为提供者的东西定义,这是您在使用
$provide
时创建的东西。通过
$provide
服务上的
provider
方法定义提供程序,您可以通过请求将
$provide
服务注入应用程序的
配置
功能来获得该服务。例如:

app.config(函数($provide){
$provide.provider('greeting',function()){
这是。$get=function(){
返回函数(名称){
警报(“你好,”+姓名);
};
};
});
});
在这里,我们为一个名为
问候语
的服务定义了一个新的提供者;我们可以将名为
greeting
的变量注入任何可注入函数(如控制器,稍后将详细介绍),Angular将调用提供者的
$get
函数以返回服务的新实例。在这种情况下,将被注入的是一个函数,它接受一个
名称
参数,并根据名称发出一条消息。我们可以这样使用它:

app.controller('MainController',函数($scope,greeting){
$scope.onClick=function(){
问候语(“福特·普里菲克特”);
};
});
现在有个诀窍。
工厂
服务
都是定义提供者各个部分的快捷方式——也就是说,它们提供了一种定义提供者的方法,而无需键入所有内容。例如,您可以编写完全相同的提供者,如下所示:

app.config(函数($provide){
$provide.factory('greeting',function(){
返回函数(名称){
警报(“你好,”+姓名);
};
});
});
理解这一点很重要,因此我将重新表述:在引擎盖下,AngularJS正在为我们调用与我们上面编写的代码完全相同的代码(提供.provider.provider版本)。从字面上看,这两个版本100%没有区别<代码>值
的工作原理是一样的——如果我们从
$get
函数(即我们的
工厂
函数)返回的任何内容都是完全相同的,那么我们可以使用
编写更少的代码。例如,由于我们总是为
问候语
服务返回相同的函数,因此我们也可以使用
来定义它:

app.config(函数($provide){
$provide.value('greeting',函数(名称){
警报(“你好,”+姓名);
});
});
同样,这与我们用来定义此函数的其他两种方法完全相同——这只是一种节省键入的方法

现在你可能注意到了我一直在使用的这个恼人的
app.config(function($provide){…})
东西。由于定义新的提供者(通过上述任何给定方法)非常常见,AngularJS直接在模块对象上公开
$provider
方法,以节省更多的输入:

var myMod=angular.module('myModule',[]);
myMod.provider(“问候语”,…);
myMod.工厂(“问候语”,…);
myMod.值(“问候语”,…);
这些都与我们以前使用的更详细的
app.config(…)
版本做了相同的事情

到目前为止,我跳过的一个可注入变量是
constant
。现在,很容易说它的工作原理与
value
一样。稍后我们会看到有一个区别

回顾一下,所有这些代码都在做完全相同的事情:

myMod.provider('greeting',function(){
这是。$get=function(){
返回函数(名称){
警报(“你好,”+姓名);
};
};
});
myMod.factory('greeting',function()){
返回函数(名称){
警报(“你好,”+姓名);
};
});
myMod.value('greeting',函数(名称){
警报(“你好,”+姓名);
});
喷油器() injector负责使用我们通过
$provide
提供的代码实际创建我们服务的实例(没有双关语)。每当您编写一个接受注入参数的函数时,您都会看到注入器在工作。每个AngularJS应用程序都有一个在应用程序首次启动时创建的
$injector
;您可以通过将
$injector
注入任何可注入函数(是的,
$injector
知道如何注入自身!)

一旦有了
$injector
,您就可以通过调用
get
来获取已定义服务的实例,其中包含服务的名称。比如说,

var greeting=$injector.get('greeting');
问候语(“福特·普里菲克特”);
注入器还负责将服务注入函数中;例如,您可以使用injector的
invoke
方法将服务神奇地注入到您拥有的任何函数中

var myFunction=function(问候语){
问候语(“福特·普里菲克特”);
};
$inje
+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+
| Can we inject? | Constant | Controller | Directive | Factory | Filter | Provider | Service | Value |
+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+
| Constant       |          |            |           |         |        |          |         |       |
| Controller     |          |            |           |         |        |          |         |       |
| Directive      |          |            |           |         |        |          |         |       |
| Factory        |          |            |           |         |        |          |         |       |
| Filter         |          |            |           |         |        |          |         |       |
| Provider       |          |            |           |         |        |          |         |       |
| Service        |          |            |           |         |        |          |         |       |
| Value          |          |            |           |         |        |          |         |       |
+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+