详解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 相关文章推荐
学习jquery必备 api中英文对照的chm手册 下载
May 03 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
JS鼠标拖拽实例分析
Nov 23 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
解决vue+webpack打包路径的问题
Mar 06 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
vue.js循环radio的实例
Nov 07 Javascript
Javascript实现html转pdf高清版(提高分辨率)
Feb 19 Javascript
在Vue.js中使用TypeScript的方法
Mar 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
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
Python字典,函数,全局变量代码解析
2017/12/18 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
平面设计求职信
2014/03/10 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
拓展策划方案
2014/06/03 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
代办委托书怎么写
2014/08/01 职场文书
甜品店创业计划书
2014/08/14 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
解除同居协议书
2015/01/29 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript