詳解Angular中的自定義服務(wù)Service、Provider以及Factory
背景來源于前段時(shí)間的一場(chǎng)面試,面試官看著我Angular控制器中添加各種功能重復(fù)的方法,臉都發(fā)綠了,不過還是耐心地跟我指出提高Angular代碼復(fù)用性需要Service、Provider和Factory三種復(fù)用性很高的方法,遂習(xí)之,以下是我的學(xué)習(xí)成果:
先說說Factory:
通過注冊(cè).factory('my注冊(cè)名',方法()),返回一個(gè)對(duì)象,你就能在控制器中引入這個(gè)方法并訪問這個(gè)對(duì)象:
例子:
<!-- factory模式 -->
<div ng-controller="theFactoryCtrl">
<h3>Factory模式</h3>
<ul>
<li ng-repeat="i in names">
{{i}}
</li>
</ul>
</div>
JS代碼:
/*工廠模式,注入?yún)?shù)中調(diào)用的是這個(gè)函數(shù)里的返回值*/
app.factory("myFactory",function(){
var args = arguments;
var obj = {}
obj.exec = function(){
var arr = [];
for(let i = 0; i<arguments.length; i++){
arr.push(arguments[i]);
}
return arr;
}
return obj;
})
app.controller("theFactoryCtrl",function ($scope,myFactory) {
$scope.names = myFactory.exec("張三的歌","趙四的舞","老王賊六");
})
效果:

Service:
在service使用構(gòu)造函數(shù)的方法去用它,在控制器中是以new的方式引入,所以可以調(diào)用service中定義的屬性
HTML:
<!-- service模式 -->
<div ng-controller="theServiceCtrl">
<h3>Service模式</h3>
<p>prop:{{prop}}</p>
<p>num:{{num}}</p>
</div>JS:
app.controller("theServiceCtrl",function($scope,myService){
$scope.prop = myService.prop("呵呵");
$scope.num = myService.num;
})
/*Service是new出來的,所以可以直接調(diào)用里面的屬性*/
app.service("myService",function(){
this.num = Math.floor(Math.random()*10);//0到10的隨機(jī)數(shù)
this.prop = function(arg){
return arg;
};
})效果:

Provider:
如果你想在創(chuàng)建服務(wù)之前先對(duì)服務(wù)進(jìn)行配置,那么你需要provider,因?yàn)閜rovider可以通過定義config,并在$get中訪問config
HTML:
<!-- provider模式 -->
<div ng-controller="theProviderCtrl">
<h3>Provider模式</h3>
<p>姓名:{{info.name}}</p>
<p>部隊(duì):{{info.squad}}</p>
<p>職務(wù):{{info.role}}</p>
</div>JS:
/*使用$get方法關(guān)聯(lián)對(duì)應(yīng)的config*/
app.provider("myProvider",function(){
this.$get = function(){
return {
name : "朱子明",
squad : "保衛(wèi)員",
role : this.roleSet
}
}
})
/*名字必須符合規(guī)范:xxxxxxProvider*/
app.config(function(myProviderProvider){
myProviderProvider.roleSet = "保衛(wèi)干事"
})
app.controller("theProviderCtrl",function($scope,myProvider){
$scope.info = {
name : myProvider.name,
squad : myProvider.squad,
role : myProvider.role
}
})
效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angularjs 實(shí)現(xiàn)移動(dòng)端在線測(cè)評(píng)效果(推薦)
這篇文章主要介紹了Angularjs 實(shí)現(xiàn)移動(dòng)端在線測(cè)評(píng)效果,需要的朋友可以參考下2017-04-04
Angular 4 依賴注入學(xué)習(xí)教程之FactoryProvider的使用(四)
這篇文章主要給大家介紹了關(guān)于Angular 4 依賴注入之FactoryProvider使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Angular4具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
AngularJS 實(shí)現(xiàn)按需異步加載實(shí)例代碼
這篇文章主要介紹了AngularJS 實(shí)現(xiàn)按需異步加載實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2015-10-10
Angular JS數(shù)據(jù)的雙向綁定詳解及實(shí)例
這篇文章主要介紹了Angular JS數(shù)據(jù)的雙向綁定詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-12-12
AngularJS+Bootstrap3多級(jí)導(dǎo)航菜單的實(shí)現(xiàn)代碼
將介紹如何用AngularJS構(gòu)建一個(gè)強(qiáng)大的web前端系統(tǒng)。文章介紹如何實(shí)現(xiàn)多限級(jí)導(dǎo)航菜單。本文圖文并茂給大家介紹的非常詳細(xì),感興趣的朋友參考下吧2017-08-08

