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不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
js实现class样式的修改、添加及删除的方法
Jan 20 Javascript
js正则表达式验证密码强度【推荐】
Mar 03 Javascript
JS获取子、父、兄节点方法小结
Aug 14 Javascript
JS简单实现滑动加载数据的方法示例
Oct 18 Javascript
jquery学习笔记之无new构建详解
Dec 07 jQuery
js操作table中tr的顺序实现上移下移一行的效果
Nov 22 Javascript
vue router动态路由设置参数可选问题
Aug 21 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
Nov 05 Javascript
vue keep-alive的简单总结
Jan 25 Vue.js
Python机器学习之决策树和随机森林
Jul 15 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
php smarty函数扩展
2010/03/15 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
Python应用领域和就业形势分析总结
2019/05/14 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
会计电算化专业自荐信
2014/03/15 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
react中的DOM操作实现
2021/06/30 Javascript
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server