详解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仿百度贴吧验证码特效实例代码
Jan 16 Javascript
jquery动态添加删除一行数据示例
Jun 12 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
Sep 21 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
May 12 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
小程序清理本地缓存的方法
Aug 17 Javascript
JavaScript遍历DOM元素的常见方式示例
Feb 16 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
vue-cli3+typescript新建一个项目的思路分析
Aug 06 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
Python实现的生成格雷码功能示例
2018/01/24 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
揠苗助长教学反思
2014/02/04 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL