详解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 相关文章推荐
一个获取第n个元素节点的js函数
Sep 02 Javascript
浅谈javascript语法和定时函数
May 03 Javascript
jquery图片滚动放大代码分享(2)
Aug 28 Javascript
解决js图片加载时出现404的问题
Nov 30 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
angularjs指令之绑定策略(@、=、&amp;)
Apr 13 Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 Javascript
尝试自己动手用react来写一个分页组件(小结)
Feb 09 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
TypeScript类型声明书写详解
Aug 28 Javascript
OpenLayers3实现测量功能
Sep 25 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
Python fileinput模块使用实例
2015/06/03 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python如何提升爬虫效率
2020/09/27 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
《一件运动衫》教学反思
2014/02/19 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
会计工作决心书
2014/03/11 职场文书
数据保密承诺书
2014/06/03 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
杭白菊导游词
2015/02/10 职场文书
mysql部分操作
2021/04/05 MySQL
python入门之算法学习
2021/04/22 Python
MySQL kill不掉线程的原因
2021/05/07 MySQL