AngularJS中service,factory,provider的區別
- angular原理 :執行在JavaScript context環境下
通過佇列watch列表 監聽變數 ,APPLY 放入事件佇列中,digest去輪訓列表 - .control 初始化scope和增加方法
.service 理解為MVC結構中的M層,來處理具體的業務邏輯,
特點:- 懶載入(lazy loading):只有在需要用的時候(也就是在其他service,filter,directive或者controller裡面依賴注入的時候才會生成這個service例項)
- 單例模式(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的函式也就是 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),不過,它們有兩個顯著的區別:
- value不可以在config裡注入,但是constant可
- value可以修改,但是constant不可以修改,一般直接用constant配置一些需要經常使用的資料。