详解Angularjs中的依赖注入
一个对象通常有三种方式可以获得对其依赖的控制权:
在内部创建依赖;
通过全局变量进行引用;
在需要的地方通过参数进行传递
依赖注入是通过第三种方式实现的。比如:
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并自然而然地把对它的引用传递进去:
Hello
而在内部,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依赖注入有所帮助。相关阅读:
jQuery中get()方法用法实例
C#实现Dev Grid拖拽移动行的方法
php+ajax实现无刷新动态加载数据技术
Win10文件资源管理器又现Bug:自定义文件夹跳转失败
Win8.1系统录音文件保存在哪?Win8.1查找录音机录音文件目录的方法
Win10登陆界面出现两个微软账户怎么办 Win10登陆界面出现两个微软账户解决办法
Android普通对话框用法实例分析
在MAC中该如何共享打印机、扫描仪等
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
iOS App开发中导航栏的创建及基本属性设置教程
360通用php防护代码(使用操作详解)
使用jQuery和Bootstrap实现多层、自适应模态窗口
JavaScript中Math.SQRT2属性的使用详解
ThinkPHP采用原生query实现关联查询left join实例