详解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 相关文章推荐
JavaScript 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
JavaScript高级程序设计 DOM学习笔记
Sep 10 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
微信小程序 Image API实例详解
Sep 30 Javascript
Vue自定义指令封装节流函数的方法示例
Jul 09 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
详解json串反转义(消除反斜杠)
Aug 12 Javascript
Webpack中loader打包各种文件的方法实例
Sep 03 Javascript
原生JS实现分页
Apr 19 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的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
jquery radio 操作代码
2011/03/16 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
js图片预加载示例
2014/04/30 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
python使用pil生成缩略图的方法
2015/03/26 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
python属于跨平台语言码
2020/06/09 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
C# .NET面试题
2015/11/28 面试题
经济系大学生求职信
2013/10/01 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
python not运算符的实例用法
2021/06/30 Python