1. 程式人生 > >AngularJS的自定義服務,factory、provider、service、constant、value等方法的區別

AngularJS的自定義服務,factory、provider、service、constant、value等方法的區別

module
- filter() 自定義過濾器
- directive() 自定義指令
- factory() 自定義服務
- provider()
區別
$get

下面我們介紹一下factory()的自定義操作

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>factory方法的自定義服務</title
>
<script src="angular.min.js"></script> <script> var m1 = angular.module('myApp',[]); //首先在模組m1下新增factory的方法,它接受兩個引數,第一個引數是服務的名字,第二個引數是一個回撥函式,可以是陣列的形式也可以只是個回撥函式,如果是要引入一些服務操作的話儘量使用陣列的形式 m1.factory('myService',function(){ return{//通過return的方式返回一個結果,例如寫一個屬性和一個方法 name :‘hello’, show : function
(){
return this.name + ':angular'; } }; }); m1.controller('Aaa',['$scope','myService',function($scope){ console.log(myService.show());//在控制檯打印出show的方法 }]);
</script> </head> <body> <div ng-controller="Aaa"> </div> </body> </html>

舉個例子,比如說我們現在需要一個生成隨機數的服務

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
<script src="angular.min.js"></script>
<script>
var m1 = angular.module('myApp',[]);
m1.factory('myRandomNum',function(){
    return function(num1,num2){
        return Math.random()*(num2-num1)+num1;
    };
})

m1.controller('Aaa',['$scope','myRandomNum',function($scope,myRandomNum){
    console.log(myRandomNum(-3,6));
}]);

</script>
</head>
<body>
    <div ng-controller="Aaa"> 
    </div>
</body>
</html>

我們也可以通過provider的方法來自定義服務,provider和factory其實是比較類似的;
下面我們主要說一下factory與provider的區別;
factory方法是不能夠進行初始化配置的,也就是我們所說的模組下面供應商,利用config方法來初始化操作是不可以的;但是如果我們自定義的服務想進行初始化配置,就需要使用provider的方法;
AngularJS供應商——初始化配置介紹

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>provider</title>
<script src="angular.min.js"></script>
<script>
var m1 = angular.module('myApp',[]);
m1.provider('myRandomNum',function(){   //裡面除了要寫return之外還需要寫一個$get的方法
    return {
        bolInt : false,
        int : function(argBol){//取整方法
            if(argBol){
                this.bolInt = true;
            }
            else{
                this.bolInt = false;
            }
        },
        $get : function(){
            var This = this;
            return function(num1,num2){
                return This.bolInt ? Math.round(Math.random()*(num2 - num1)) + num1 : Math.random()*(num2 - num1) + num1;
            };
        }
    };  
});

m1.config(['myRandomNumProvider',function(myRandomNumProvider){//   
    myRandomNumProvider.int(true);  //取整
}]);

m1.controller('Aaa',['$scope','myRandomNum',function($scope,myRandomNum){  
    console.log( myRandomNum(-3,6) );   
}]);
</script>
</head>
<body>
<div ng-controller="Aaa"> 
</div>
</body>
</html>

例如:

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
<script src="angular.min.js"></script>
<script>
var m1 = angular.module('module1',[]);
m1.factory('myService',function(){  
    return {
        name : 'hello',
        show : function(){
            return this.name + ':angular';
        }
    };  
});
var m2 = angular.module('myApp',['module1']);//引入module1
m2.controller('Aaa',['$scope','myService',function($scope,myService){    
    console.log(myService.show());  
}]);
</script>
</head>
<body>
<div ng-controller="Aaa">
</div>
</body>
</html>

factory與provider還有個區別就是factory可以多次呼叫;例如我們建一個service.js的檔案
service.js

var m1 = angular.module('module1',[]);
m1.factory('myService',function(){
    return {
        name : 'hello',
        show : function(){
            return this.name + ':angular';
        }
    };
});

可以分別在兩個頁面呼叫
頁面一

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
<script src="angular.min.js"></script>
<script src="service.js"></script>
<script>
var m2 = angular.module('myApp',['module1']);
m1.config(['myServiceProvider',function(myServiceProvider){
    myServiceProvider.name = 'hi';  
}]);
m2.controller('Aaa',['$scope','myService',function($scope,myService){    
    console.log(myService.show());  
}]);
</script>
</head>
<body>
<div ng-controller="Aaa">   
</div>
</body>
</html>

頁面二

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
<script src="angular.min.js"></script>
<script src="service.js"></script>
<script>
var m2 = angular.module('myApp',['module1']);
m2.controller('Aaa',['$scope','myService',function($scope,myService){    
    console.log(myService.show());  
}]);
</script>
</head>
<body>
<div ng-controller="Aaa">  
</div>
</body>
</html>

注意事項:
1、自定義的服務,儘量不要用美元符號開頭;因為以美元符號開始的都是內部服務
2、一般情況下自定義服務寫在內部服務的後面

AngularJS除了factory與provider之外還有些不常用的自定義服務
模組間的通訊
-service()
-針對面向物件的,建構函式的服務

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>service服務</title>
<script src="angular.min.js"></script>
<script>
var m1 = angular.module('myApp',[]);
m1.service('myService',FnService);
function FnService(){//建構函式
    this.name = 'hello';
}
FnService.prototype.age = 20;
m1.controller('Aaa',['$scope','myService',function($scope,myService){    
    console.log(myService.name);
    console.log(myService.age); 
}]);
</script>
</head>
<body>
<div ng-controller="Aaa">  
</div>
</body>
</html>

constant()
-設定常量
constant和value都是用來設定常量的,他們的區別是constant方法是可以通過config方法配置獲取的,而value方法是不可以通過配置獲取的;

<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
<script src="angular.min.js"></script>
<script>
var m1 = angular.module('myApp',[]);
m1.constant('myService','hello angular');
m1.config(['myService',function(myService){
    console.log(myService);
}]);
m1.controller('Aaa',['$scope','myService',function($scope,myService){    
    console.log(myService); 
}]);
</script>
</head>
<body>
<div ng-controller="Aaa">
</div>
</body>
</html>

value()
- 區別

總結:
①factory方法是不能用config方法進行初始化配置的,而provider是可以使用config方法進行初始化配置的
②factory方法可以在多次呼叫
③service方法是針對面向物件,建構函式的自定義服務
④constant方法與value方法都是用來設定常量的,但是constant方法可以通過config方法進行初始化配置,而value方法不可以進行初始化配置