当前位置:Gxlcms > JavaScript > 详解Angularjs中的依赖注入

详解Angularjs中的依赖注入

时间:2021-07-01 10:21:17 帮助过:161人阅读

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

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

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

  1. function SomeClass(greeter) {
  2. this.greeter = greeter;
  3. }
  4. SomeClass.prototype.greetName = function(name) {
  5. this.greeter.greet(name);
  6. };

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

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

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

  1. angular.module('myApp', [])
  2. .factory('greeter', function() {
  3. return {
  4. greet: function(msg) {alert(msg);}
  5. }
  6. })
  7. .controller('MyController',
  8. function($scope, greeter) {
  9. $scope.sayHello = function() {
  10. greeter.greet("Hello!");
  11. };
  12. });

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

  1. <div ng-app="myApp">
  2. <div ng-controller="MyController">
  3. <button ng-click="sayHello()">Hello</button>
  4. </div>
  5. </div>

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

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

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

人气教程排行