angularjs 五種服務用法
每個controller層控制著不同的html,修改其中一個controller中資料資訊不會影響另外的controller裡的資料資訊(每個控制層之間不會相互影響),如果想每個控制層都有共用的方法,可以把共用的寫到angular的服務裡,這些服務都要注入到controller中,在控制器中使用 。下邊先簡單介紹value,constant,factory,service,provider,這5種服務的的基本用法,然後舉個例子。
value
用來定義值。與 constant 的區別是:value可以被修改(被後邊的值覆蓋),可以被 decorator 裝飾,不能被注入到 config 中。
//第一種------第一個引數是服務名稱,第二個是常量
app.value('myValue', '11111111')
//第二種----第一個引數是服務名稱,第二個是obj物件
app.value('myValue',{
name:'kk',
age:12,
getId:function(){
return 1;
}
});
constant
用於定義常量。一般一旦定義就不能被改變。可以被注入到任何地方,但是不能被裝飾器(decorator)裝飾。
//第一種------第一個引數是服務名稱,第二個是常量 app.constant('myConstant', '11111111') //第二種----第一個引數是服務名稱,第二個是obj物件 app.constant('myConstant',{ name:'kk', age:12, getId:function(){ return 1; } });
factory
factory 返回一個物件。app.factory('name',function(){return obj}) ----- name是服務名
比如使用$http來獲取一些資料.我們就在factory建立的服務裡抓取資料,最後返回.
它和constant,value最大的區別是,factory服務是有一個處理過程,經過這個過程,才返回結果的.
//第一種方式----看得出來,factory 的第二個引數就是provider中$get要對應的函式實現。 app.factory('myFactory', function(){ return { a : 'hello'; b :function(){}; } }) //第二種方式 app.factory('myFactory', function(){ var f = {}; f.a = 'hello'; f.b = function(){}; return f; }) //第三種方式-------相當於service服務寫法 app.factory('myFactory',function(){ return new conFun() }); function conFun(){ this.name ="lili"; this.age = 12; this.getId = function(){ return 1; } }
service
service 類似於一個構造器, 通過 new 關鍵字例項化物件,將一些屬性和方法直接新增到 this 上,在建立 service 物件時, this 會被作為返回值返回。
//第一種格式
app.service('myService',function(){
this.name ='lili';
this.age =12;
this.getId = function(){
return 1;
}
});
//第二種格式---------跟factory的方法類似,只是不需要寫new新物件
app.service('myService',consFun);
function consFun(){
this.name ="lili";
this.age = 12;
this.getId = function(){
return 1;
}
}
provider
只有provder是能注入到.config() 函式中;在config函式裡注入provider時,名字應該是:providerName+Provider,比如provider的服務名叫myProvider,注入時: .confige('',myProviderProvider'')。 你可以在Provider物件傳遞到應用程式的其他部分之前在app.config函式中對其進行修改(這也是與factory不同的地方,factory不能修改)。 provider服務的第二個引數的返回值中必須要有$get方法(除了$get,還可以有其它方法),$get方法就相當於factory服務的第二個引數,最後要返回一個物件,這個物件就是真正被注入的服務。也就是說當你使用Provider建立一個服務時,唯一的可以在你的控制器中訪問的屬性和方法是通過$get()函式返回內容。
app.provider('服務名稱',function(){
....
return { //return一定要寫
...
$get:function(){ //$get一定要寫,真正被注入的就是$get
...
return obj物件
}
}
})
事例:
html程式碼:
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<title>服務</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/test.js"></script>
</head>
<body>
<div ng-controller="ctrl1" id="d1">
<h4>控制器::::::{{ctrl}}</h4>
<h4>value:::::::{{va}}</h4>
<h4>constant::::::{{cons}}</h4>
<h4>factory.name::::::{{name}}</h4>
<h4>factory方法返回值::::::{{fid}}</h4>
<h4>service.age::::::{{age}}</h4>
<h4>性別::::::{{sex}}</h4>
<h4>provider.$get::::::{{p_fun}}</h4>
</div>
</body>
</html>
js程式碼:
angular.module("app",[])
.value("v",'value1')
.value("v",'value2')
.constant("c",'cons111')
.constant("c",'cons222')
.factory("f",function () {
return{
name:"張三",
getId:function () {
// console.log("factory方法")
return 1;
}
}
})
.service("s",function () {
this.age=12;
this.getFun=function () {}
})
.provider('myProvider',function () {
var a=666;
//一定要有return,否則報錯
return{
//真正被注入到控制器的是$get裡的資料,所以sex在頁面打印不出來
sex:'男',
$get:function () {
return{
setp:function () {
return a;
}
}
}
}
})
.config(function(myProviderProvider){
myProviderProvider.sex = '女';
})
.controller("ctrl1",['$scope','v','c','f','s','myProvider',function ($scope,v,c,f,s,myProvider) {
$scope.ctrl="ctrl1";
$scope.va=v;
$scope.cons=c;
$scope.name=f.name;
//getId()是方法,一定要帶著括號
$scope.fid=f.getId();
$scope.age=s.age;
$scope.sex=myProvider.sex;
$scope.p_fun=myProvider.setp();
}])