AngularJSAngularjs之仗注入

一个对象一般发生三种植办法得以获对那赖的控制权:

  1. 每当其中创立依赖;
  2. 通过全局变量进行引用;
  3. 于得之地方通过参数进行传递

赖注入是由此第三种方式贯彻的。比如:

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})

 

相关文章