一、定義
如前所述,$scope對象被神秘的注入到了控制器中,實際上,這是因為控制器聲明了它需要$scope,所以AngularJS才會創建並注入它。這套依賴管理系統可以這樣總結:"為了正常工作,我需要一個依賴(協作對象):我不知道它從哪里來,也不知道它如何創建。我只知道我需要它,所以請為我提供它"。
AngularJS擁有內建的依賴注入(dependeny injection,DI)引擎,職責如下:
- 理解對象對其協作對象的需求。
- 找到所需的協作對象。
- 連接協作對象,以形成功能完備的應用。
二、注冊服務
AngularJS只連接其認識的對象。因此,接入依賴注入機制的第一步,是將對象注冊在模塊(module)上。我們不直接注冊對象的實例,而是將對象創建方案拋給依賴注入系統。然后AngularJS解釋這些方案以初始化對象,並在之后連接他們,最后成為可運行的項目。
AngularJS的$provide服務可以注冊不同的對象創建方案。之后$injector服務會解釋這些方案,生成完備而可用的對象實例(已經解決好所有的依賴關系)。
$injector服務創建的對象成為服務(service)。在整個應用的生命中,每種方案AngularJS僅解釋一次,也就是說,每個對象僅有一個實例。
http://www.yiibai.com/angularjs/angularjs_dependency_injection.html
五種對象創建方案:
2.1 值
定義一個名為defaultInput值,可以注入到控制器中
// 定義一個模塊 var mainApp = angular.module("mainApp", []); // 創建 value 對象 "defaultInput" 並傳遞數據 mainApp.value("defaultInput", 5); ... // 將 "defaultInput" 注入到控制器 mainApp.controller('CalcController', function($scope, CalcService, defaultInput) { $scope.number = defaultInput; $scope.result = CalcService.square($scope.number); $scope.square = function() { $scope.result = CalcService.square($scope.number); } });
2.2 服務
定義一個名為CalcService的服務,可以注入到控制器中
//define a module var mainApp = angular.module("mainApp", []); ... //create a service which defines a method square to return square of a number. mainApp.service('CalcService', function(MathService){ this.square = function(a) { return MathService.multiply(a,a); } }); //inject the service "CalcService" into the controller mainApp.controller('CalcController', function($scope, CalcService, defaultInput) { $scope.number = defaultInput; $scope.result = CalcService.square($scope.number); $scope.square = function() { $scope.result = CalcService.square($scope.number); } });
2.3 Factory
//define a module var mainApp = angular.module("mainApp", []); //create a factory "MathService" which provides a method multiply to return multiplication of two numbers mainApp.factory('MathService', function() { var factory = {}; factory.multiply = function(a, b) { return a * b } return factory; }); //inject the factory "MathService" in a service to utilize the multiply method of factory. mainApp.service('CalcService', function(MathService){ this.square = function(a) { return MathService.multiply(a,a); } }); ...
2.4 常量
mainApp.constant("configParam", "constant value");
2.5 Provider
//define a module var mainApp = angular.module("mainApp", []); ... //create a service using provider which defines a method square to return square of a number. mainApp.config(function($provide) { $provide.provider('MathService', function() { this.$get = function() { var factory = {}; factory.multiply = function(a, b) { return a * b; } return factory; }; }); });