1. 程式人生 > >AngularJS中service,factory,provider的區別

AngularJS中service,factory,provider的區別

  1. angular原理 :執行在JavaScript context環境下
    通過佇列watch列表 監聽變數 ,APPLY 放入事件佇列中,digest去輪訓列表
  2. .control 初始化scope和增加方法
  3. .service 理解為MVC結構中的M層,來處理具體的業務邏輯,
    特點:

    1. 懶載入(lazy loading):只有在需要用的時候(也就是在其他service,filter,directive或者controller裡面依賴注入的時候才會生成這個service例項)
    2. 單例模式(singleton):第一次被注入就建立例項,然後在cache中,直到app退出,只有在應用生命週期結束的時候(關閉瀏覽器)才會被清除
      服務三種實現方式:

    3.1factory()模式:常用,註冊function ,函式返回service例項(含return),例項時呼叫,
    實現步驟:1.定義一個obj var service={}
    2. obj中含有方法和值 var service={ user:{},setName:function(){ 具體實現邏輯 } }
    3. return obj return service;
    不需要處理複雜的邏輯,且不需要使用config配置服務
    程式碼顯示:

     app.factory('User'
, function ($http) { // injectables go here var backendUrl = "http://localhost:3000"; //1.定義物件 var service = { // our factory definition //2.物件中含有方法和屬性 user: {}, setName: function (newName) { service.user['name'] = newName; return
newName; }, save: function () { return $http.post(backendUrl + '/users', { user: service.user }); } }; //3.返回物件 return service; }); //在應用裡面使用service()方法 app.controller('MainCtrl', function ($scope, User) { $scope.saveUser = User.setName("2222"); });

3.2service模式 :相當於對factory做了一層封裝, 寫factory中的方法和值 ,通過建構函式,呼叫方法一樣
service()方法很適合使用在功能控制比較多的service裡面

angular.module('myApp.services')
.service('User', function($http) { // injectables go here
  var self = this; // Save reference
  this.user = {};
  this.backendUrl = "http://localhost:3000";
  this.setName = function(newName) {
    self.user['name'] = newName;
  }
  this.setEmail = function(newEmail) {
    self.user['email'] = newEmail;
  }
  this.save = function() {
    return $http.post(self.backendUrl + '/users', {
      user: self.user
    })
  }
});

angular.module('myApp')
.controller('MainCtrl', function($scope, User) {
  $scope.saveUser = User.save;
});

3.3provider模式 : factory和service的底層均是provider, 裡面含有get get的函式也就是 factory中的function, 直接new一個物件給$get,通過注入的時候獲取這個函式

angular.module('myApp.services')
.provider('User', function() {
  this.backendUrl = "http://localhost:3000";
  this.setBackendUrl = function(newUrl) {
    if (url) this.backendUrl = newUrl;
  }
  this.$get = function($http) { // injectables go here
    var self = this;
    var service = {
      user: {},
      setName: function(newName) {
        service.user['name'] = newName;
      },
      setEmail: function(newEmail) {
        service.user['email'] = newEmail;
      },
      save: function() {
        return $http.post(self.backendUrl + '/users', {
          user: service.user
        })
      }
    };
    return service;
  }
});

//為了給service進行配置,我們可以將provider注入到.config()方法裡面
angular.module('myApp')
.config(function(UserProvider) {
  UserProvider.setBackendUrl("http://myApiBackend.com/api");
})

//這樣我們就可以和其他方式一樣在應用裡面使用這個service了
angular.module('myApp')
.controller('MainCtrl', function($scope, User) {
  $scope.saveUser = User.save;
});

4.constant(name,value)可以將一個已經存在的變數值註冊為服務,並將其注入到應用的其他部分中。其中,name為註冊的常量的名字,value為註冊的常量的值或物件。

angular.module('myApp') .constant('apiKey','123123123')
.controller('MyController', function($scope, apiKey) {
// 可以像上面一樣用apiKey作為常量
// 用123123123作為字串的值
$scope.apiKey = apiKey;
});

5.value(name,value)的name同樣是需要註冊的服務名,value將這個值將作為可以注入的例項返回。

ngular.module('myApp')
.value('apiKey','123123123');

它們最大的區別是:常量可以注入到配置函式中,而值不行。
通常情況下,可以通過value()來註冊服務物件或函式,用constant()來配置資料。
當我們想要建立一個服務,並且這個服務只需要返回資料時,就可以使用constant(name,value)和value(name,value),不過,它們有兩個顯著的區別:

  1. value不可以在config裡注入,但是constant可
  2. value可以修改,但是constant不可以修改,一般直接用constant配置一些需要經常使用的資料。