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
JQuery 引发两次$(document.ready)事件
Jan 15 Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 Javascript
document.all的一个比较完整的总结及案例
Jan 31 Javascript
javascript实现跳转菜单的具体方法
Jul 05 Javascript
javascript 回调函数详解
Nov 11 Javascript
微信企业号开发之微信考勤Cookies的使用
Sep 11 Javascript
Vue脚手架的简单使用实例
Jul 10 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
vue 组件间的通信之子组件向父组件传值的方式
Jul 29 Javascript
JavaScript数组 几个常用方法总结
Nov 11 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上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
jquery 上下滚动广告
2009/06/17 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
js实现登录与注册界面
2017/11/01 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
python实现kMeans算法
2017/12/21 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
个人公开承诺书
2014/03/28 职场文书
教师考核评语
2014/04/28 职场文书
小班幼儿评语大全
2014/04/30 职场文书
法院信息化建设方案
2014/05/21 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
政风行风建设责任书
2014/07/23 职场文书
动物科学专业求职信
2014/07/27 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
2015年机关党委工作总结
2015/05/23 职场文书