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 相关文章推荐
js过滤HTML标签以及空格的思路及代码
May 24 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
javascript实现校验文件上传控件实例
Apr 20 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
js获取所有checkbox的值的简单实例
May 30 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
Jul 12 Javascript
NProgress显示顶部进度条效果及使用详解
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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vscode下的vue文件格式化问题
2018/11/28 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
python妹子图简单爬虫实例
2015/07/07 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
《姥姥的剪纸》教学反思
2014/02/25 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
物理学专业自荐信
2014/06/11 职场文书
《正比例》教学反思
2016/02/23 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL