AngularJS中的依賴注入和服務(wù)(service)
Posted on 2015-02-09 19:28 云自無心水自閑 閱讀(7287) 評論(0) 編輯 收藏 所屬分類: 心得體會 、AngularJS在前文(http://www.aygfsteel.com/usherlight/archive/2015/02/01/422633.html)中我們曾經(jīng)介紹過,定義controller時,需要2個參數(shù),第一個參數(shù)是controller的名稱,第二個參數(shù)是一個數(shù)組,數(shù)組的最后一個元素將是controller的函數(shù),前面的參數(shù)是controller的依賴項。我們現(xiàn)在就來仔細(xì)分析一下其中的具體過程。
先給一個例子:
angular. module('notesApp' , [])
. controller('MainCtrl' , ['$log' , function($log) {
var self = this;
self. logStuff = function() {
$log. log('The button was pressed' );
};
}])
. controller('MainCtrl' , ['$log' , function($log) {
var self = this;
self. logStuff = function() {
$log. log('The button was pressed' );
};
}])
在這個例子中可以看到,我們在第一個參數(shù)中用字符串(服務(wù)名稱)添加了一個依賴項。當(dāng)我們通過字符串聲明了這一個服務(wù)之后,我們就可以把它當(dāng)作一個變量注入到函數(shù)中。AngularJS會自動查找字符串名稱對應(yīng)的服務(wù)名,按照順序?qū)⑵渥⑷氲胶瘮?shù)中。
myModule.controller("MainCtrl", ["$log", "$window", function($l, $w) {}]);
在這個例子中,$log, $windows是AngularJS自帶的兩個服務(wù),在數(shù)組中通過名稱聲明后,會被注入到函數(shù)的兩個參數(shù)中。
比較常用的AngularJS自帶的服務(wù)有:$window, $location, $http等
從上面的例子中可以看出,AngularJS的設(shè)計思想就是不要在函數(shù)中自己去實例化或者通過其它途徑來獲取服務(wù)的實例,而是聲明需要的對象,由AngularJS來注入具體的實例。
創(chuàng)建自己的服務(wù)
什么時候應(yīng)該創(chuàng)建服務(wù),而不是controller呢?
1。 需要重用的時候
2。需要保留應(yīng)用級的狀態(tài)。這是非常重要的一點,controller是會不斷地被創(chuàng)建和銷毀的,如果需要保存應(yīng)用級的狀態(tài),就需要使用service
3。和頁面顯示無關(guān)
4。需要和第三方服務(wù)整合
5。緩存
服務(wù)是會被延遲加載的,也就是說只有在第一次被引用的時候,才會被創(chuàng)建。
服務(wù)將會被定義一次,也只會被實例化一次。
在這個例子中,$log, $windows是AngularJS自帶的兩個服務(wù),在數(shù)組中通過名稱聲明后,會被注入到函數(shù)的兩個參數(shù)中。
比較常用的AngularJS自帶的服務(wù)有:$window, $location, $http等
從上面的例子中可以看出,AngularJS的設(shè)計思想就是不要在函數(shù)中自己去實例化或者通過其它途徑來獲取服務(wù)的實例,而是聲明需要的對象,由AngularJS來注入具體的實例。
創(chuàng)建自己的服務(wù)
什么時候應(yīng)該創(chuàng)建服務(wù),而不是controller呢?
1。 需要重用的時候
2。需要保留應(yīng)用級的狀態(tài)。這是非常重要的一點,controller是會不斷地被創(chuàng)建和銷毀的,如果需要保存應(yīng)用級的狀態(tài),就需要使用service
3。和頁面顯示無關(guān)
4。需要和第三方服務(wù)整合
5。緩存
服務(wù)是會被延遲加載的,也就是說只有在第一次被引用的時候,才會被創(chuàng)建。
服務(wù)將會被定義一次,也只會被實例化一次。