天天看點

AngularJS 服務 provider factory service及差別

一、概念說明

  1、服務是對公共代碼的抽象,如多個控制器都出現了相似代碼,把他們抽取出來,封裝成一個服務,遵循DRY原則,增強可維護性,剝離了和具體表現相關的部分,聚焦于業務邏輯或互動邏輯,更加容易被測試和複用。

  2、工程實戰中,使用服務的目的使為了優化結構,複用是一項結果,而不是目标。

  3、代碼中混雜表現層邏輯和業務邏輯的時候,就可以抽取服務,哪怕它不能複用。

  4、測試驅動開發方式,服務有利于寫測試用例。

  5、服務是和依賴注入相關的,依賴注入要求服務都是單例,才能把它們到處注入,不用手動管理它們的生命周期,并可以“”延遲初始化“”等優化措施。

  6、服務分常量(Constant)、變量(Value),服務(Service)、工廠(Factory)、供應商(Provider)。

  7、變量和常量的差別是,變量的值可以被修改;服務是AngularJS會New出來,然後儲存執行個體,供它注入,而工廠 ,AngularJS不會New,其會調用工廠裡的函數,擷取傳回值,然後儲存這個傳回值,供它到處注入;Constant和Provider 可以傳進 .config() 函數的服務,在Config階段就可以用,其他都是要Provider執行個體化的結果,要在Config階段完成後可用;除了常量外,其他服務背後都是通過Provider來實作的,可以看成是一張文法糖,編譯後,其實都是Provider。

二、例子

1、provider provide

  隻要滿足規則:提供一個帶有傳回值的

$get

方法。

  是唯一一種可以傳進 .config() 函數的 service。當你想要在 service對象啟用之前,先進行子產品範圍的配置,那就應該用 provider。

app.provider('test', function() {  
    console.log('instance test');  
    var f = function(name) {  
        alert("Hello, " + name);  
    };  
    this.$get = function() { //一定要有!  
        return f;  
    };  
});  

app.config(function(testProvider) {  
    testProvider('I am config');  
});      

   $provide服務負責告訴Angular如何創造一個新的可注入的東西:即服務。服務會被叫做供應商的東西來定義,你可以使用$provide來建立一個供應商。你需要使用$provide中的provider()方法來定義一個供應商,同時你也可以通過要求$provide被注入到一個應用的config函數中來獲得$provide服務。使用方法是傳回一個$get函數,注意在config階段,隻有provider能被注入

app.config(function($provide) {  
    $provide.provider('greeting', function() {  
        this.$get = function() {  
            return function(name) {  
                alert("Hello," + name);  
            };  
        };  
    });  
  /*  greetingProvider('ff');*/  
});       

2、factory

  factory 可以說是 provider 的變種, 方法中的第二個參數就是 $get 中的内容,需要new 一個對象傳回。

app.factory('myFactory', function() {  
    console.log('instance myFactory');  
    var factory = {};  
    var privateValue = "I am Private";  
    factory.variable = "This is public";  
    factory.getPrivate = function() {  
        return privateValue;  
    };  
    return factory;  
});        

3、service

  在 factory中需要 new 一個對象傳回,而 service 就更簡單了,這一步都幫你省了, 他的第二個參數就是你要傳回的對象類,一般直接用this來操作資料、定義函數

app.service('myService', function() {  
    var privateValue = "I am Private";  
    this.variable = "This is public";  
    this.getPrivate = function() { return privateValue;  
};  
});      

三、差別

  1、用 factory 就是建立一個對象,為它添加屬性,然後把這個對象傳回出來。你把 service 傳進 controller 之後,在 controller 裡這個對象裡的屬性就可以通過 factory 使用了。   2、service 是用"new"關鍵字執行個體化的。是以,你應該給"this"添加屬性,然後 service會 傳回"this"。你把 service 傳進 controller 之後,在controller裡 "this" 上的屬性就可以通過 service 來使用了。   3、 providers 是唯一一種你可以傳進 .config() 函數的 service。當你想要在 service 對象啟用之前,先進行子產品範圍的配置,那就應該用 provider。   4、factory/service是第一個注入時才執行個體化,而provider不是,它是在config之前就已執行個體化好   5、

service定義的function

是一個構造器(

constructo

r),

Angular

在調用

service

時會用new關鍵字,而調用

factory

時隻是調用普通的

function

,是以

factory

可以傳回任何東西,service不需要傳回。 四、選擇服務類型   1、需要全局可配置參數, 選擇Provider   2、純資料,沒有行為,選擇Value   3、Angular會New,而且隻一次,不用參數 用Service   4、拿到類,自己New出執行個體, 用Factory   5、拿到函數,自己調用,用Factory   總結,是純資料,先用Value,當發現有行為,改為Service,當發現通過計算得出結果時,用Factory,當需要全局配置的話,用Provider。

轉載于:https://www.cnblogs.com/shawnhu/p/8467264.html