详解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 相关文章推荐
js中prototype用法详细介绍
Nov 14 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
js仿微博实现统计字符和本地存储功能
Dec 22 Javascript
javascript拖拽效果延伸学习
Apr 04 Javascript
纯JS实现可拖拽表单的简单实例
Sep 02 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
vue高德地图之玩转周边
Jun 16 Javascript
详解Vue整合axios的实例代码
Jun 21 Javascript
bootstrap table表格客户端分页实例
Aug 07 Javascript
浅谈mint-ui 填坑之路
Nov 06 Javascript
微信小程序实现城市列表选择
Jun 05 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
十天学会php之第四天
2006/10/09 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
php PDO中文乱码解决办法
2009/07/20 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
js表单验证实例讲解
2016/03/31 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
有多年工作经验的自我评价
2014/03/02 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
教师个人学习总结
2015/02/11 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
运动员入场词
2015/07/18 职场文书
董事长新年致辞
2015/07/29 职场文书
初中班主任工作随笔
2015/08/15 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python