详解AngularJS中的依赖注入机制


Posted in Javascript onJune 17, 2015

 依赖注入是一个在组件中给出的替代了硬的组件内的编码它们的依赖关系的软件设计模式。这减轻一个组成部分,从定位的依赖,依赖配置。这有助于使组件可重用,维护和测试。

AngularJS提供了一个至高无上的依赖注入机制。它提供了一个可注入彼此依赖下列核心组件。

  •     值
  •     工厂
  •     服务
  •     提供者
  •     常值

值是简单的JavaScript对象,它是用来将值传递过程中的配置相位控制器。

//define a module
var mainApp = angular.module("mainApp", []);
//create a value object as "defaultInput" and pass it a data.
mainApp.value("defaultInput", 5);
...
//inject the value in the controller using its name "defaultInput"
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);
  }
});

工厂

工厂是用于返回函数的值。它根据需求创造值,每当一个服务或控制器需要。它通常使用一个工厂函数来计算并返回对应值

//define a module
var mainApp = angular.module("mainApp", []);
//create a factory "MathService" which provides a method multiply to return multiplication of two numbers
mainApp.factory('MathService', function() {   
  var factory = {}; 
  factory.multiply = function(a, b) {
   return a * b 
  }
  return factory;
}); 

//inject the factory "MathService" in a service to utilize the multiply method of factory.
mainApp.service('CalcService', function(MathService){
   this.square = function(a) { 
   return MathService.multiply(a,a); 
  }
});
...

服务

服务是一个单一的JavaScript包含了一组函数对象来执行某些任务。服务使用service()函数,然后注入到控制器的定义。

//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service which defines a method square to return square of a number.
mainApp.service('CalcService', function(MathService){
   this.square = function(a) { 
   return MathService.multiply(a,a); 
  }
});
//inject the service "CalcService" into the controller
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);
  }
});

提供者

提供者所使用的AngularJS内部创建过程中配置阶段的服务,工厂等(相AngularJS引导自身期间)。下面提到的脚本,可以用来创建,我们已经在前面创建MathService。提供者是一个特殊的工厂方法以及get()方法,用来返回值/服务/工厂。

//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service using provider which defines a method square to return square of a number.
mainApp.config(function($provide) {
  $provide.provider('MathService', function() {
   this.$get = function() {
     var factory = {}; 
     factory.multiply = function(a, b) {
      return a * b; 
     }
     return factory;
   };
  });
});

常量

常量用于通过配置相位值考虑事实,值不能使用期间的配置阶段被传递。

mainApp.constant("configParam", "constant value");

例子

下面的例子将展示上述所有指令。
testAngularJS.html

<html>
<head>
  <title>AngularJS Dependency Injection</title>
</head>
<body>
  <h2>AngularJS Sample Application</h2>
  <div ng-app="mainApp" ng-controller="CalcController">
   <p>Enter a number: <input type="number" ng-model="number" />
   <button ng-click="square()">X<sup>2</sup></button>
   <p>Result: {{result}}</p>
  </div>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>
  <script>
   var mainApp = angular.module("mainApp", []);
  
   mainApp.config(function($provide) {
     $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);
     }
   });
  </script>
</body>
</html>

结果

在Web浏览器打开textAngularJS.html。看到结果如下。

详解AngularJS中的依赖注入机制

Javascript 相关文章推荐
jQuery插件开发基础简单介绍
Jan 07 Javascript
javascript实现英文首字母大写
Apr 23 Javascript
动态加载js文件简单示例
Apr 21 Javascript
常用原生JS兼容性写法汇总
Apr 27 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 Javascript
vuejs2.0实现一个简单的分页示例
Feb 22 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
Mar 04 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
[js高手之路]寄生组合式继承的优势详解
Aug 28 Javascript
javascript刷新父页面方法汇总详解
Oct 10 Javascript
vue中 v-for循环的用法详解
Feb 19 Javascript
详解AngularJS中的作用域
Jun 17 #Javascript
简介AngularJS中使用factory和service的方法
Jun 17 #Javascript
简介AngularJS的视图功能应用
Jun 17 #Javascript
在AngularJS中使用AJAX的方法
Jun 17 #Javascript
使用AngularJS来实现HTML页面嵌套的方法
Jun 17 #Javascript
AngularJS的表单使用详解
Jun 17 #Javascript
举例讲解AngularJS中的模块
Jun 17 #Javascript
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
德劲1104的电路分析与改良
2021/03/01 无线电
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
用Django写天气预报查询网站
2018/10/21 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Django的性能优化实现解析
2019/07/30 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
平安工地建设方案
2014/05/06 职场文书
大四毕业生自荐书
2014/07/05 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Pandas搭配lambda组合使用详解
2022/01/22 Python
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers