AngularJS服務中serivce,factory,provider的區別

Angular服務是一個由服務工廠建立的單例對象。這些服務工廠是由 service provider 依次建立的。而service providers是構造函數。它們必須包含一個$get屬性用於在實例化的時候返回服務工廠。angularjs

當你請求一個服務,$injector負責找到正確的service provider,而後將它實例化獲得service factory,並調用service factory的 $get 方法來獲得服務的實例。api

  • provider(provider) - 使用$injector來註冊一個 service provider 。
  • constant(obj) - 註冊一個只有providers 和 services 能夠訪問的 值或對象。
  • value(obj) - 註冊一個只有services 能夠訪問的 值或對象。
  • factory(fn) - 註冊一個 service factory 方法,該方法被包裹在 provider 對象當中,並經過 $get 屬性來返回這個 factory 方法。
  • service(class) - 註冊一個構造方法,它是一個被包裹在 service provider 對象中的類,而後經過 $get 屬性來使用該構造方法實例化一個新的對象。

provider(name, provider);

參數 類型 詳細
name string

實例(也就是service factory)名稱。記住:它的 provider 須要經過 name + 'Provider' 來訪問。數組

provider Object/function()

若是這個 provider 是:ide

  • 對象: 那麼它應該有一個 $get 方法。 這個 $get 方法會在一個實例須要被建立的時候使用$injector.invoke() 來調用。
  • 構造函數: 那麼它會使用 $injector.instantiate() 來建立一個provider 的實例,並以對象的形式返回。

 

factory(name, $getFn);

註冊一個service factory,它用於返回一個service 的實例。這是一個註冊service factory的簡單的寫法,由於它的provider 僅僅包含一個 $get 屬性。若是你不須要在provider中配置你的 service ,那你能夠使用它。函數

參數 類型 詳細
name string

實例的名稱spa

$getFn function()

建立實例的$get方法。 本質來講這是一個$provide.provider(name, {$get: $getFn})的簡寫法。code

service(name, constructor);

註冊一個構造方法, 它會經過new方法來建立service實例。 這也是一個$provide.provider(name, {$get: $getFn})的簡寫法,但這裏$getFn是一個構造函數,而後經過new來返回服務的實例。對象

若是你將你的服務定義爲一個type或class,你應該使用$provide.service(class)。blog

value(name, value);

經過 $injector 註冊一個value service,它能夠是一個字符串、數值、數組、對象或者方法。該值實際上也是經過它的provider的$get屬性,一個沒有參數的方法來返回的value service。字符串

它跟constant services很像,但不一樣點在於他們不能被注入到模塊的配置方法中。

相關文章
相關標籤/搜索