详解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 相关文章推荐
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
Feb 15 Javascript
对table和ul实现js分页示例分享
Feb 24 Javascript
Javascript实现的SHA-256加密算法完整实例
Feb 02 Javascript
js定时器实例分享
Dec 20 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 Javascript
利用node.js爬取指定排名网站的JS引用库详解
Jul 25 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
vue项目中引入vue-datepicker插件的详解
May 14 Javascript
vue中 this.$set的用法详解
Sep 06 Javascript
layui的数据表格+springmvc实现搜索功能的例子
Sep 28 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来实现网络服务
2009/09/15 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
JS画5角星方法介绍
2013/09/17 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
js实现登录与注册界面
2017/11/01 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
深度解读vue-resize的具体用法
2020/07/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
Python中bisect的用法
2014/09/23 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python中常用的内置方法
2019/01/28 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
python时间time模块处理大全
2020/10/25 Python
python selenium 获取接口数据的实现
2020/12/07 Python
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
Ajax和javascript的区别
2013/07/20 面试题
函授生自我鉴定
2014/03/25 职场文书
小学教师寄语大全
2014/04/03 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
班级体育活动总结
2014/07/05 职场文书
爱心募捐通知范文
2015/04/27 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS