依賴注入的是服務。
app.controller app.filter app.directive app.config 都會注入服務斩启。
但是 angular.module:
angular.module(name, [requires], [configFn]);這里沒有依賴注入。 這是模塊管理岖妄。
依賴注入
依賴注入(Dependency Injection)是一種經(jīng)典的設計模式眉菱,主要是用來處理組件如何獲取依賴的問題。
依賴注入可以簡單的理解為:在一個容器中我們定義了很多個模塊和組件化服務珍逸,當模塊需要某些服務時,只需要跟容器說我需要這些服務聋溜,并且只需要提供服務的名稱谆膳,容器就會自動提供這些服務的實例。調用服務的模塊不需要考慮這些服務是怎么來的撮躁,這些服務會由容器通過依賴注入提供給對應的模塊漱病。
注入聲明方式
AngularJs一共提供了三種注入方式
推斷式的注入聲明,顯示注入聲明,行內注入聲明
注意的地方:當依賴注入的服務定義在了另一個模塊中,首先需要將該模塊注入到被依賴的模塊中把曼,然后才能調用該模塊的服務
行內:
var app = angular.module('myApp', []);
app.controller('myCtrl', ['$scope', '$window', function ($scope, $window) {
// do something
}]);
AngularJS內置服務
服務是一個單例對象杨帽,在每個應用中只會被實例化一次(被$injector實例化),并且是延遲加載的(需要時才會被創(chuàng)建)嗤军。服務提供了把與特定功能相關聯(lián)的方法集中在一起的接口注盈。提供了在應用整個生命周期保持數(shù)據(jù)的方法, 比如下面的例子,每個controller里都可以拿到和改變foo.a,保存用戶登陸等信息中我們用到了:
.controller("myCtrl", ["foo", function( foo){
foo.sayHello();
console.log(foo.a);
}])
.factory("foo", function(){
return {
a: 1,
sayHello: function(){
this.a++;
console.log("hello")
}
}
})
服務是一個對外提供某個特定功能型雳,如消息服務擎鸠、文件壓縮等的獨立模塊。在AngularJS中拉讯,服務是一個單例對象或者函數(shù)婶芭。具有以下的兩個特點:
- 服務是一個單例,即無論這個服務被注入到任何地方,對象始終只有一個實例
- 定義服務的方式也是通過function,但是與我們自己定義一個function然后在其他地方調用不同,因為服務是被定義在一個模塊中权纤,所以其使用的范圍是可以被管理的,這一點體現(xiàn)了AngularJS非常強的避免全局變量污染意識乌妒。
代表性的內置服務
- $rootScope
每個應用都僅有一個rootScope汹想。其他的例如controller中的scope都是rootScope的后代scope。scope通過監(jiān)聽數(shù)據(jù)層的變化撤蚊,實現(xiàn)了數(shù)據(jù)層和模型層的分離古掏。注冊在$rootScope上的值可以被子$scope覆蓋。
- $http
$http服務是AngularJS和遠程服務器通過ajax請求進行通信的核心服務侦啸。$http的API是基于$q服務的槽唾,它返回的是一個promise。根據(jù)返回的狀態(tài)碼判斷執(zhí)行成功的回調還是失敗的回調光涂,當狀態(tài)碼為200到299時執(zhí)行成功回調庞萍,不在這個范圍內的都執(zhí)行失敗回調。
- $q
$q服務是AngularJS自己封裝的一種對Promise的實現(xiàn)忘闻,使用$q一般有兩種方式钝计。
- $q構造方法
$q的構造方法接收一個函數(shù),該函數(shù)接收resolve和reject兩個參數(shù)齐佳,分別代表成功和失敗后的回調函數(shù) - $q的defer()方法
- $location
$location是用于解析地址欄URL的服務私恬,可以監(jiān)聽和改變地址欄的URL。當改變地址欄或者點擊前進和后退時可以與瀏覽器同步URL