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