依赖注入

   依赖注入(DI)是一个经典的设计模式, 主要是用来处理组件如何获得依赖的问题。关于DI,推荐阅读Martin Flower的文章(http://martinfowler.com/articles/injection.html )。

Angular负责创建组件,解决它们之间的依赖关系,并按要求提供其他组件。

使用依赖注入

  依赖注入在angular应用代码中使用很频繁。我们可以在定义组件或者在模块的run和config块中使用。

- 可在angular组件(控制器、服务、过滤器、指令、动画等)的构造方法或工厂方法中声明依赖关系。可以向这些组件中注入服务(service)或者值(value)类型的依赖。

-  可为控制器添加一些特殊的依赖,我们将在下面具体介绍。

-  可在模块的run方法中定义依赖,可被注入的依赖包括服务(service)、值(value)和参量(constant)。注意.在run方法中不能注入"provider"类型的依赖.

-  可在模块的config中声明“provider”和“constant”类型的依赖,但不能注入service和value组件。

依赖注入

   angular在执行某些方法(例如在服务的工厂方法、控制器构造方法)时会借助注入器(injector)。因此我们需要在这些方法中加入标注来通知注入器哪些依赖需要被注入。可以通过以下三种方式注入服务:

- 通过数组标注在方法的参数中声明依赖(优先考虑)

- 定义在控制器构造方法的$inject属性中

- 通过方法参数名隐式的添加(有些注意事项)

    数组标注:   

   优先考虑用该方式为组件定义依赖,例如:

someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) {
// ...
}]);
在代码中通过在第二个数组类型的参数中声明了'$scope','greeter'等依赖,数组最后一个元素为实际的构造方法,注意在构造方法的参数列表与其面的数组元素是一一对应的。

$inject属性

我们还可以通过为控制器的构造方法添加$inject属性,并在该属性中添加依赖的方式定义依赖。

var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);

注意$inject中依赖的顺序与构造方法中的参数需保持一致。

隐式声明依赖

最简单的声明依赖的方式就是让设构造方法的参数与依赖的名字一样。

someModule.controller('MyController', function($scope, greeter) {
// ...
});  注入器可以从函数的参数名中推断所依赖的服务。上面的函数中声明了$scope和greeter服务作为依赖。 这种方式可是代码更加简洁,但这种方式不能和Javascript的代码混淆器一起使用。

AngularJS提供了最高的依赖注入机制。它提供了以下核心组件,可以注入彼此依赖 

  • Value:变量可以修改,不可在config里注入
  • factory
  • service
  • provider
  • constant:常量,不可修改,可以在config里注入


var mainApp = angular.module("mainApp", []);


mainApp.constant("constant", 7);


    mainApp.config(["$provide","constant",function($provide,constant) {


         console.log(constant);


         $provide.provider('MathService', function() {


            this.$get = function() {


               var factory = {}; 


               factory.multiply = function(a, b) {


                  return a * b;


               }


               return factory;


            };


         });


      }]);


      mainApp.value("defaultInput", 5);


    


      mainApp.factory('MathService', function() {    


         var factory = {}; 


         factory.multiply = function(a, b) {


            return a * b;


         }


         return factory;


      });


 


      mainApp.service('CalcService', function(MathService){


            this.square = function(a) {


            return MathService.multiply(a,a);


         }


      });


 


      mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {


            $scope.number = defaultInput;


            $scope.result = CalcService.square($scope.number);


 


            $scope.square = function() {


               $scope.result = CalcService.square($scope.number);


            }


      });

 

工厂方法

  angular中的指令、服务或者过滤器可以通过工厂方法定义。工厂方法是模块(module)的子方法。通常推荐按下面的方式使用工厂方法:

angular.module('myModule', [])
.factory('serviceId', ['depService', function(depService) {
// ...
}])
.directive('directiveName', ['depService', function(depService) {
// ...
}])
.filter('filterName', ['depService', function(depService) {
// ...
}]);

模块方法

angular模块提供了config和run方法方便开发者为模块添加配置和运行上下文的设置。和工厂方法类似,我们可以在config和run方法中定义依赖。例如:

angular.module('myModule', [])
.config(['depProvider', function(depProvider) {
// ...
}])
.run(['depService', function(depService) {
// ...
}]);

控制器

  控制器的构造方法主要用来定义模板中所用的模型数据和行为。通常推荐按如下用法使用构造器:

someModule.controller('MyController', ['$scope', 'dep1', 'dep2', function($scope, dep1, dep2) {
...
$scope.aMethod = function() {
...
}
...
}]);

除了service, value类的依赖,控制器中还注入一下依赖:

- $scope:  控制器是与某个DOM元素通过作用域相关联。其他类型的组件只能访问$rootScope服务。

- resolves : 如果在路由中实例化控制器,那么在路由里面解析的任何值域都可以作为依赖注入到控制器。

1.  angular.module('myModule', [])

2.  .config(['depProvider', function(depProvider) {

3.    // ...

4.  }])

5.  .run(['depService', function(depService) {

6.    // ...

}]);

angular 依赖注入的更多相关文章

  1. Angular依赖注入详解

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  2. 30行代码让你理解angular依赖注入:angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...

  3. angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...

  4. [译] 关于 Angular 依赖注入你需要知道的

    如果你之前没有深入了解 Angular 依赖注入系统,那你现在可能认为 Angular 程序内的根注入器包含所有合并的服务提供商,每一个组件都有它自己的注入器,延迟加载模块有它自己的注入器. 但是,仅 ...

  5. Angular依赖注入:全面讲解(翻译中)

    在实际使用Angular依赖注入系统时,你需要知道的一切都在本文中.我们将以实用易懂并附带示例的形式解释它的所有高级概念. Angular最强大.最独特的功能之一就是它内置的依赖注入系统. 大多数时候 ...

  6. 理论+案例,带你掌握Angular依赖注入模式的应用

    摘要:介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题. 本文分享自 ...

  7. angular依赖注入的理解(转)

    使用过java进行开发的人肯定知道大名鼎鼎的spring框架,对于spring的IOC肯定也有所了解,通过配置文件定义好bean之后,如果需要使用这些bean,不需要自己去实例化,而是跟spring这 ...

  8. angular依赖注入(2)——注入器的使用

    一.显示注入器 injector = ReflectiveInjector.resolveAndCreate([Car, Engine, Tires]); let car = injector.get ...

  9. angular依赖注入(1)——从父元素到子元素的数据注入

    1.什么是依赖注入? 依赖注入是一种编程模式,可以让类从外部源中获得它的依赖,不必亲自创建他们. (这就达到了一个效果,我不知道我是怎么实现的,但我创建了一个实现他的接口,然后接口封装起来,1.可以分 ...

随机推荐

  1. 一次性搞清楚equals和hashCode

    前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常 ...

  2. int a=5,则 ++(a++)的值是?

    编译出错:++(a++)先计算的是括号里的(a++),返回的结果是一个表达式,其值是5,不能对表达式进行赋值

  3. Ajax如何实现跨域问题

    一个域名的组成 http:// www . abc.com : 8080 /scripts/jquery.js 协议 子域名 主域名 端口号 请求资源地址 当协议.子域名.主域名.端口号中任意一个不同 ...

  4. backbone 更新1.1.2

    backbone已经更新到1.1.2,在这里总结一下 我还一直用的1.0的版本,更新确实出现了一些问题 1.1.0  Backbone Views no longer automatically at ...

  5. mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法

    mysqlnd是个好东西.不仅可以提高与mysql数据库通信的效率,而且也可以方便的设置一些超时.如,连接超时,查询超时.但是,使用mysqlnd的时候,有个地方需要注意.就是服务端的密码格式不能使用 ...

  6. Magento多语言功能

    Magento多语言功能是建立在视图(view)基础之上的,可以通过后台创建店铺视图来创建基于Magento的多语言店铺.本文为大家讲解如何创建多语言的功能.首先,进入“管理店铺”节点,如下所示. S ...

  7. JS-005-常见下拉列表 Select 和 datalist

    下拉列表在我们日常的网页浏览的过程中,随处可见,是 web 编程过程中大家非常熟悉的一个页面元素,随着 HTML 语言的日益强大,其在广大攻城狮的手中可谓是千变万化,有了很多不同的实现方式.本文主要以 ...

  8. C#获取管理员权限

    在进行C盘的读写时,有时会需要用到管理员权限 //找到位于 Properties 下面的 app.manifest 文件 将<requestedExecutionLevel level=&quo ...

  9. net Datable 基本操作

    net Datable 基本操作 using System; using System.Collections.Generic; using System.Text; using System.Dat ...

  10. http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

    http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html