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 相关文章推荐
用javascript编写的第一人称射击游戏
Feb 25 Javascript
js 编写规范
Mar 03 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
浏览器中url存储的JavaScript实现
Jul 07 Javascript
JavaScript手机振动API
Jun 11 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
jQuery右下角悬浮广告实例
Oct 17 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
jquery滚动条插件slimScroll使用方法
Feb 09 Javascript
前端把html表格生成为excel表格的实例
Sep 19 Javascript
javascript性能优化之分时函数的介绍
Mar 28 Javascript
解决Nuxt使用axios跨域问题
Jul 06 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中在PDO中使用事务(Transaction)
2011/05/14 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
eclipse php wamp配置教程
2016/06/30 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
python实现狄克斯特拉算法
2019/01/17 Python
django 信号调度机制详解
2019/07/19 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
django实现日志按日期分割
2020/05/21 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
员工考核管理制度
2014/02/02 职场文书
户外活动总结
2015/02/04 职场文书
高考学习决心书
2015/02/04 职场文书
大一学生个人总结
2015/02/15 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python