3種創建自定義服務的方式。
- Factory
- Service
- Provider
在自定義服務里注入服務示例,但不能注入$scope作用域對象。
factory
factory方式創建的服務,作用就是返回一個有屬性有方法的對象。相當於:var f = myFactory();
//創建模型
var app = angular.module('myApp', []);
//通過工廠模式創建自定義服務
app.factory('myFactory', function() {
var service = {};//定義一個Object對象'
service.name = "張三";
var age;//定義一個私有化的變量
//對私有屬性寫getter和setter方法
service.setAge = function(newAge){
age = newAge;
}
service.getAge = function(){
return age;
}
return service;//返回這個Object對象
});
//創建控制器 回調函數把自定義服務return的對象作為參數傳入 可以把他的值作為$scope的一個屬性 用於view中
app.controller('myCtrl', function($scope, myFactory) {
myFactory.setAge(20);
$scope.r =myFactory.getAge();
alert(myFactory.name);
});
service
通過service方式創建自定義服務,相當於new的一個對象:var s = new myService();,只要把屬性和方法添加到this上才可以在controller里調用。
<div ng-app="myApp" ng-controller="myCtrl">
<h1>{{r}}</h1>
</div>
<script>
var app = angular.module('myApp', []);
app.service('myService', function($http,$q) {
this.name = "service";
this.myFunc = function (x) {
return x.toString(16);//轉16進制
}
this.getData = function(){
var d = $q.defer();
$http.get("ursl")//讀取數據的函數。
.success(function(response) {
d.resolve(response);
})
.error(function(){
alert(0)
d.reject("error");
});
return d.promise;
}
});
app.controller('myCtrl', function($scope, myService) {
$scope.r = myService.myFunc(255);
myService.getData().then(function(data){
console.log(data);//正確時走這兒
},function(data){
alert(data)//錯誤時走這兒
});
});
</script>
provder
只有provder是能傳 .config() 函數的 service。如果想在 service 對象啟用之前,先進行模塊范圍的配置,那就應該選擇 provider。需要注意的是:在config函數里注入provider時,名字應該是:providerName+Provider.
使用Provider的優點就是,你可以在Provider對象傳遞到應用程序的其他部分之前在app.config函數中對其進行修改。
當你使用Provider創建一個service時,唯一的可以在你的控制器中訪問的屬性和方法是通過$get()函數返回內容
<body>
<div ng-app="myApp" ng-controller="myCtrl">
</div>
<script>
var app = angular.module('myApp', []);
//需要注意的是:在注入provider時,名字應該是:providerName+Provider
app.config(function(myProviderProvider){
myProviderProvider.setName("大聖");
});
app.provider('myProvider', function() {
var name="";
var test={"a":1,"b":2};
//注意的是,setter方法必須是(set+變量首字母大寫)格式
this.setName = function(newName){
name = newName
}
this.$get =function($http,$q){
return {
getData : function(){
var d = $q.defer();
$http.get("url")//讀取數據的函數。
.success(function(response) {
d.resolve(response);
})
.error(function(){
d.reject("error");
});
return d.promise;
},
"lastName":name,
"test":test
}
}
});
app.controller('myCtrl', function($scope,myProvider) {
alert(myProvider.lastName);
alert(myProvider.test.a)
myProvider.getData().then(function(data){
//alert(data)
},function(data){
//alert(data)
});
});
</script>
</body>
