1. 程式人生 > >angular 服務 service factory provider constant value

angular 服務 service factory provider constant value

實例 () ora known ret 錯誤 nal 語法 prompt

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