例如下面这段代码。这是一个简单的应用,声明了一个模块和一个控制器:
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})
上面的代码中并没有说明是如何找到 greeter 的,但是它的确能正常工作,因为 $injector会负责为我们查找并加载它。