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 相关文章推荐
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
js自动下载文件到本地的实现代码
Apr 28 Javascript
通过location.replace禁止浏览器后退防止重复提交
Sep 04 Javascript
javascript解析xml实现省市县三级联动的方法
Jul 25 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
详解AngularJS中module模块的导入导出
Dec 10 Javascript
详解js获取video任意时间的画面截图
Apr 17 Javascript
微信小程序上传文件到阿里OSS教程
May 20 Javascript
用Vue.js在浏览器中实现裁剪图像功能
Jun 18 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
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
PHP 各种排序算法实现代码
2009/08/20 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python retrying模块的使用方法详解
2019/09/25 Python
tensorflow常用函数API介绍
2020/04/19 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
关于对大人不礼貌的检讨书
2014/09/29 职场文书
2014年领班工作总结
2014/11/25 职场文书
如何使用pdb进行Python调试
2021/06/30 Python