一个对象通常有三种方式可以获得对其依赖的控制权:
依赖注入是通过第三种方式实现的。比如:
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依赖注入有所帮助。
如对本文有疑问, 点击进行留言回复!!
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
分享Angular http interceptors 拦截器使用(推荐)
网友评论