依赖注入

   依赖注入(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. ArcGIS中添加进自定义的ttf字符标记符号

    原文:ArcGIS中添加进自定义的ttf字符标记符号 ArcGIS系统中的样式可能不能满足实际生产需要,为了实现快速制图,可自定义一些样式,以便重复利用. 1.   制作的符号库 使用 FontCre ...

  2. 转:Asp.net Mvc4默认权限详细(上)

    前言 上篇的菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于 ...

  3. jquery 分页

    最近有点无所事事,无聊之极! 啊啊啊,表示很痛苦! <div id="tablist_01" class="list_tab"> <table ...

  4. Progress Reporting

    Progress reporting is a key activity of project management. The project manager issues regular repor ...

  5. The identity used to sign the executable is no longer valid.

    昨天运行还好好的,今天Xcode突然报这个错误. 在网上搜索了一番,也没有找到合适的解决办法. 那怎么办呢? 于是我就登陆了Appstore的开发者账号,发现里面的证书都是invalid状态,我想应该 ...

  6. iOS 使用XCode6打开项目以后再用XCode5出现的问题fatal error: malformed or corrupted AST file: 'Unable to load module

    使用不同版本的XCode出现的问题: fatal error: malformed or corrupted AST file: 'Unable to load module "/Users ...

  7. js数组判断是否含有某一个元素

    arr.indexOf('a')如果有则返回的a的下标位置,否则返回false.

  8. 如何解决SQLServer占CPU100%

    文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句会导致CPU过高? 查看SQL的查询计划 ...

  9. autorelease应用

    // //  main.m //  02-autorelease应用 // //  Created by apple on 14-3-18. //  Copyright (c) 2014年 apple ...

  10. iOS如何统计渠道

    http://bbs.umeng.com/thread-10-1-1.html https://www.zhihu.com/question/20697933