AngularJS 核心:$Provide

AngularJS 核心:$Provide

$provide負責給Angular創造一個可注入的東西:即服務。

服務會被叫做供應商的東西來定義,就是使用$provide來創建一個供應商。

你需要使用$provide中的provider()方法來定義一個供應商,同時你也可以通過$provide注入到一個應用的config函數中來獲得$provide服務。

定義供應商的方法們

AngularJS$provide去定義一個供應商,這個$provide有5個可用創建方法:

  1. constant

    定義常量用,定義的值不能被改變,它可以被注入到任何地方,但是不能被裝飾器decorator裝飾

    var app = angular.module('app', []);
    // 方式一
    app.config(function ($provide) {
      $provide.constant('me', 'is constant');
    });
    // 方式二
    app.constant('me', 'is constant');
    
  2. value

    可以是string,number甚至function,它和constant的不同之處在於,它可以被修改,不能被注入到config中,但是它可以被decorator裝飾.

    var app = angular.module('app', []);
    // 方式一
    app.config(function ($provide) {
      $provide.value('me', 'is value')
    });
    // 方式二
    app.value('me', 'is value');
    
  3. service

    一個可注入的構造器,在AngularJS中它是單例的,用它在Controller中通信或者共享數據都很合適

    var app = angular.module('app' ,[]);
    // 方式一 
    app.config(function ($provide) {
      $provide.service('me', function () {
        this.title = 'is me service';
      });
    });
    // 方式二
    app.service('me', function () {
      this.title = 'is me service';
    });
    
  4. factory

    一個可注入的function,它和service的區別就是:

    factory是普通function

    service是一個構造器constructor

    這樣Angular在調用service時會用new關鍵字,而調用factory時只是調用普通的function,所以factory可以返回任何東西,而service可以不返回

    var app = angular.module('app', []);
    // 方式一 
    app.config(function ($provide) {
      $provide.factory('me', function () {
        return {
          title: 'is factory'
        }
      });
    });
    // 方式二
    app.factory('me', function () {
      return {
        title: 'is factory'
      }
    });
    
  5. provider

    var app = angular.module('app', []);
    // 創建
    app.provider('me', function () {
      var version;
      return {
        setVersion: function (value) {
          lev = value;
        },
        // 必須有 `$get`方法
        $get: function () {
          return {
              title: 'my love' + ' ' + lev
          }
        }
      }
    });
    // 配置階段可調用 
    app.config(function (meProvider) {
      movieProvider.setVersion(1);
    });
    

    注意這裏config方法注入的是meProvider

    上面定義了一個供應商叫me,但是注入到config中不能直接寫me

    因爲前文講了注入的那個東西就是服務,是供應商提供出來的,

    config中又只能注入供應商(兩個例外是$provide$injector),所以用駝峯命名法寫成meProviderAngular就會幫你注入它的供應商。

  6. decorator該方法無法創建

    var app = angular.module('app', []);
    
    app.value('meTitle', 'code');
    
    app.config(function ($provide) {
      $provide.decorator('meTitle', function ($delegate) {
        return $delegate + '- decorator';
      });
    });
    

    這個比較特殊,它不是provider,它是用來裝飾其他provider的,而前面也說過,他不能裝飾Constant,因爲實際上Constant不是通過provider()方法創建的。

總結

  • 所有的供應商都只被實例化一次,都是單例的
  • 除了constant,所有的供應商都可以被裝飾器(decorator)裝飾
  • value就是一個簡單的可注入的值
  • service是一個可注入的構造器
  • factory是一個可注入的方法
  • decorator可以修改或封裝其他的供應商,當然除了constant
  • provider是一個可配置的factory

快速功能對比:

功能/類型 Factory Service Value Constant Provider
可以有依賴 Yes Yes No No Yes
注入沒有限制 No Yes Yes Yes No
可在配置階段使用 No No No Yes Yes
可以創建函數 Yes Yes Yes Yes Yes
可以創建原始對象 Yes No Yes Yes Yes

參考文章

AngularJS中的Provider們:Service和Factory等的區別 - SegmentFault 思否

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章