详解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代码
Apr 02 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
JavaScript代码复用模式实例分析
Dec 02 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
使用jQuery时Form表单元素ID和name命名大忌
Mar 06 Javascript
浅析JavaScript事件和方法
Feb 28 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
Mar 06 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递归法读取目录及文件的方法
2015/01/30 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python中格式化format()方法详解
2017/04/01 Python
Python实现读取并保存文件的类
2017/05/11 Python
python表格存取的方法
2018/03/07 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
元旦联欢会主持词
2014/03/26 职场文书
协议书范本
2014/04/23 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
丧事答谢词
2015/01/05 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
Python何绘制带有背景色块的折线图
2022/04/23 Python
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android