详解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 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
心扬JS分页函数代码
Sep 10 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
Jun 20 Javascript
jQuery中dequeue()方法用法实例
Dec 29 Javascript
jQuery 判断图片是否加载完成方法汇总
Aug 10 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
Sep 19 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
Jun 07 Javascript
微信小程序实现左滑删除效果
Nov 18 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php,不用COM,生成excel文件
2006/10/09 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
简单实现js轮播图效果
2017/07/14 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
python的Template使用指南
2014/09/11 Python
python批量生成本地ip地址的方法
2015/03/23 Python
python实现K最近邻算法
2018/01/29 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
Python实现SMTP邮件发送
2020/06/16 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
养殖行业的创业计划书
2014/01/05 职场文书
一年级学生评语大全
2014/04/21 职场文书
自查自纠工作总结
2014/10/15 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
民事二审代理词
2015/05/25 职场文书
孙振耀退休感言
2015/08/01 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
Python 发送SMTP邮件的简单教程
2021/06/24 Python
SQL Server中搜索特定的对象
2022/05/25 SQL Server