angular 服務 service factory provider constant value
angular服務
服務是對公共代碼的抽象,由於依賴註入的要求,服務都是單例的,這樣我們才能到處註入它們,而不用去管理它們的生命周期。
angular的服務有以下幾種類型:
常量(Constant): 用於聲明不會被修改的值。
變量(Value): 用於聲明會被修改的值。
服務(Service): 這個名稱跟服務這個大概念同名,就種行為就像是給自己孩子取名為"孩子"。只需要創建這個服務,然後等angular把它new出來,保存這個服務,然後就可以到處註入了。
工廠(Factory): 它跟上面的Service不一樣,它不會被new出來。angular會調用這個函數,獲得返回值,然後保存這個返回值,供它到處調用。
供應商(Provider):
看一張圖說明provider,服務等關系:
除了Constant之外,所有這些類型的服務,背後都是通過Provider實現的。最明顯的一個證明就是,當你使用未定義的服務時,angular給你的錯誤提示是它對應的Provider未找到。比如說使用了一個未定義的服務test,那麽錯誤提示是: Unknown provider:testProvider<- test。
Provider
provider必須有一個$get方法,聲明方式如下:
angular.module(‘myApp‘).provider(‘greeting‘, function(){ var name =‘world‘; this.setName = function(name){ name = name; }; this.$get = function(){ return ‘hello, ‘ + name; } })
使用時:
angular.module(‘myApp‘).controller(‘someCtrl‘, function($scope, greeting){ $scope.message = greeting; }))
對這個Provider進行配置:
angular.module(‘myApp‘).config(function(greetingProvider){ greetingProvider.setName(‘lyy‘); })
註意,配置時要在名稱後加provider並遵循駝峰命名法,這樣angular才能正確註入該Provier。
Service
Service很適合在Controller中通信或共享數據,Service裏可以不用返回任何東西,因為angular會調用new關鍵字來創建對象。
angular.module(‘myApp‘).service(‘greeting‘, function(){ this.sayHello = function(name){ return ‘hello, ‘ + name; } })
使用:
angular.module(‘myApp‘).controller(‘someCtrl‘, function($scope, greeting){ $scope.message = greeting.sayHello(‘world‘); }))
相當於:
angular.module(‘myApp‘).provider(‘greeting‘, function(){ this.$get = function(){ var greeting = function(){ this.sayHello = function(name){ return ‘hello, ‘ + name; } } return new greeting(); } })
Factory
Factory和Service的區別就是:factory是普通function,而service是一個構造器,所以factory可以返回任何東西,而service可以不返回。
angular.module(‘myApp‘).factory(‘greeting‘, function(){ return ‘hello, world‘; })
Constant
Constant比較特殊,它不是Provider的語法糖,而且它的初始化時機非常早,可以在angular.module(‘myApp‘).config()中註入,而其他的服務除了Provider之外都不可以。這就意味著,如果你要在config中使用一個全局配置項,那麽它就只能聲明為常量。Constant不能被裝飾器(decorator)裝飾。
angular.module(‘myApp‘).constant(‘name‘,‘lyy‘);
註入到config中:
angular.module(‘myApp‘).config(function(name){ $scope.userName=name; })
Value
Value與Constant的區別是,Value可以被修改,不能註入到config中,但是能被裝飾器(decorator)裝飾。
angular.module(‘myApp‘).value(‘name‘,‘lyy‘);
angular提供了那麽多服務,那麽我們應該什麽時候用適合的服務呢?
如果是純數據,選Value;
如果還需要添加行為,改寫成Service;
發現需要通過計算給出結果,改寫成Factory;
需要進行全局配置,改寫成Provider。
Decorator
Decorator比較特殊,它不是provider,它是用來裝飾其他provider的。但是對於Decorator一定要慎用。
比如說有一個第三方庫叫ui,它有一個prompt函數,我們不能改它的源碼,但是需要讓它每次彈出提問框時都在控制臺輸出一條記錄,那麽我們可以這樣寫:
angular.module(‘myApp‘).config(function($provide){ //$delegate是ui的原始服務 $provide.decorator(‘ui‘, function($delegate){ //保存原始的prompt函數 var originalPrompt=$delegate.prompt; //用自己的prompt代替 $delegate.prompt=function(){ //先執行原始的prompt函數 originalPrompt.apply($delegate, arguments); //寫一條日誌 console.log(‘prompt‘); }; //返回原始服務的實例 return $delegate; }) })
angular 服務 service factory provider constant value