详解Angularjs中的依赖注入


Posted in Javascript onMarch 11, 2016

一个对象通常有三种方式可以获得对其依赖的控制权:

  • 在内部创建依赖;
  • 通过全局变量进行引用;
  • 在需要的地方通过参数进行传递

依赖注入是通过第三种方式实现的。比如:

function SomeClass(greeter) {
this.greeter = greeter;
}
SomeClass.prototype.greetName = function(name) {
this.greeter.greet(name);
};

SomeClass能够在运行时访问到内部的greeter,但它并不关心如何获得对greeter的引用。
为了获得对greeter实例的引用,SomeClass的创建者会负责构造其依赖关系并传递进去。

基于以上原因,AngularJS使用$injetor(注入器服务)来管理依赖关系的查询和实例化。
事实上,$injetor负责实例化AngularJS中所有的组件,包括应用的模块、指令和控制器等。

例如下面这段代码。这是一个简单的应用,声明了一个模块和一个控制器:

angular.module('myApp', [])
.factory('greeter', function() {
return {
greet: function(msg) {alert(msg);}
}
})
.controller('MyController',
function($scope, greeter) {
$scope.sayHello = function() {
greeter.greet("Hello!");
};
});

当AngularJS实例化这个模块时,会查找greeter并自然而然地把对它的引用传递进去:

<div ng-app="myApp">
<div ng-controller="MyController">
<button ng-click="sayHello()">Hello</button>
</div>
</div>

而在内部,AngularJS的处理过程是下面这样的:

// 使用注入器加载应用
var injector = angular.injector(['ng', 'myApp']);
// 通过注入器加载$controller服务:var $controller = injector.get('$controller');
var scope = injector.get('$rootScope').$new();
// 加载控制器并传入一个作用域,同AngularJS在运行时做的一样
var MyController = $controller('MyController', {$scope: scope})

以上就是本文的全部内容,希望本文对大家学习Angularjs依赖注入有所帮助。

Javascript 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
JavaScript学习笔记(十七)js 优化
Feb 04 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
php常见的页面跳转方法汇总
Apr 15 Javascript
浅谈jQuery构造函数分析
May 11 Javascript
基于javascript html5实现3D翻书特效
Mar 14 Javascript
Javascript前端经典的面试题及答案
Mar 14 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
Sep 22 jQuery
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
详解AngularJS过滤器的使用
Mar 11 #Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 #Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 #Javascript
基于jQuery日历插件制作日历
Mar 11 #Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 #Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 #Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 #Javascript
You might like
php 生成饼图 三维饼图
2009/09/28 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python 字符串追加实例
2019/07/20 Python
Python切图九宫格的实现方法
2019/10/10 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
python tqdm库的使用
2020/11/30 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
农村产权制度改革实施方案
2014/03/21 职场文书
关于学习的演讲稿
2014/05/10 职场文书
人民调解员培训方案
2014/06/05 职场文书
迁户口计划生育证明
2014/10/19 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书