欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Angularjs中的依赖注入

程序员文章站 2022-11-19 09:26:20
一个对象通常有三种方式可以获得对其依赖的控制权: 在内部创建依赖; 通过全局变量进行引用; 在需要的地方通过参数进行传递 依赖注入是通过第三种方...

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

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

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

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依赖注入有所帮助。