Angularjs之重视注入

2个指标1般有三种格局得以拿走对其借助的控制权:

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

 

相关文章