AngularJS 依赖注入详解和简单实例


Posted in Javascript onJuly 28, 2016

AngularJS 依赖注入

什么是依赖注入

wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。
该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则。与服务定位器模式形成直接对比的是,它允许客户端了解客户端如何使用该系统找到依赖

一句话 --- 没事你不要来找我,有事我会去找你。

AngularJS 提供很好的依赖注入机制。以下5个核心组件用来作为依赖注入:

value
factory
service
provider
constant

value

Value 是一个简单的 javascript 对象,用于向控制器传递值(配置阶段):

var mainApp = angular.module("mainApp", []);

// 创建 value 对象 "defaultInput" 并传递数据
mainApp.value("defaultInput", 5);
...

// 将 "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);
  }
});

factory

factory 是一个函数用于返回值。在 service 和 controller 需要时创建。
通常我们使用 factory 函数来计算或返回值。

// 定义一个模块
var mainApp = angular.module("mainApp", []);

// 创建 factory "MathService" 用于两数的乘积 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;
}); 

// 在 service 中注入 factory "MathService"
mainApp.service('CalcService', function(MathService){
  this.square = function(a) {
   return MathService.multiply(a,a);
  }
});
...

provider

AngularJS 中通过 provider 创建一个 service、factory等(配置阶段)。

Provider 中提供了一个 factory 方法 get(),它用于返回 value/service/factory。

// 定义一个模块
var mainApp = angular.module("mainApp", []);
...

// 使用 provider 创建 service 定义一个方法用于计算两数乘积
mainApp.config(function($provide) {
  $provide.provider('MathService', function() {
   this.$get = function() {
     var factory = {}; 
     
     factory.multiply = function(a, b) {
      return a * b; 
     }
     return factory;
   };
  });
});

constant

constant(常量)用来在配置阶段传递数值,注意这个常量在配置阶段是不可用的。

mainApp.constant("configParam", "constant value");

实例

以下实例提供了以上几个依赖注入机制的演示。

<html>
  
  <head>
   <meta charset="utf-8">
   <title>AngularJS 依赖注入</title>
  </head>
  
  <body>
   <h2>AngularJS 简单应用</h2>
   
   <div ng-app = "mainApp" ng-controller = "CalcController">
     <p>输入一个数字: <input type = "number" ng-model = "number" /></p>
     <button ng-click = "square()">X<sup>2</sup></button>
     <p>结果: {{result}}</p>
   </div>
   
   <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/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>

 运行结果:

 AngularJS 依赖注入详解和简单实例

 以上就是对AngularJS 依赖注入资料整理,后续继续补充,希望能帮助开发AngularJS 的朋友。

Javascript 相关文章推荐
让插入到 innerHTML 中的 script 跑起来的实现代码
Jul 01 Javascript
JS隐藏参数post传值实例
Apr 18 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
Feb 06 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
基于JavaScript实现选项卡效果
Jul 21 Javascript
基于vue1和vue2获取dom元素的方法
Mar 17 Javascript
快速解决brew安装特定版本flow的问题
May 17 Javascript
一个简单的node.js界面实现方法
Jun 01 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
AngularJS中实现动画效果的方法
Jul 28 #Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 #Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 #Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 #Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 #Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 #Javascript
AngularJS中的API(接口)简单实现
Jul 28 #Javascript
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
offsetParent 算法分析
2010/04/05 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Python open读写文件实现脚本
2008/09/06 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
董事长岗位职责
2013/11/30 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
村主任当选感言
2015/08/01 职场文书
2015年国庆节寄语
2015/08/17 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
python glom模块的使用简介
2021/04/13 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
Java实现简易的分词器功能
2021/06/15 Java/Android
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript