本教程使用AngularJS版本:1.5.3
angularjs GitHub: https://github.com/angular/angular.js/
AngularJs下載地址:https://angularjs.org/
用有過spring的人都知道,Spring的核心思想就是DI(依賴注入,Dependency Injection)和IOC(控制反轉 Invension of Controller),AngularJS的service其實就是用到了這里的DI思想,那么什么叫做DI?所謂DI,就是指對象是被動接受依賴類而不是自己主動去找,換句話說就是指對象不是從容器中查找它依賴的類,而是在容器實例化對象的時候主動將它依賴的類注入給它。我個人的理解就是,你在實例化一個類時,它會自動去實例化它里面所用到的其它實例。所以這就叫依賴注入。在Angular里面,services作為單例對象在需要到的時候被創建,只有在應用生命周期結束的時候(關閉瀏覽器)才會被清除。而controllers在不需要的時候就會被銷毀了。
AngualrJs中可用來注入的有三種類型,service、factory、provider,這三種寫法不樣,用法也都不一樣。其中,service只實例化一次,其實就是單例模式的思想。無論我們在什么地方注入我們的service,將永遠使用同一個實例。所以對很多在controller層中的操作就可以放到serivce層中去。AngularJS提供例如許多內在的服務,如:$http, $route, $window, $location等。每個服務負責例如一個特定的任務,$http是用來創建AJAX調用,以獲得服務器的數據。 $route用來定義路由信息等。內置的服務總是前綴$符號。
其中,三者的關系可以看成是下圖:

一、Service使用詳解
(1)定義
一個學用的service用法如下:
一般直接用this來操作數據、定義函數。
- app.service('myService', function() {
- var privateValue = "I am Private";
- this.variable = "This is public";
- this.getPrivate = function() { return privateValue;
- };
- });
(2)AngularJS中使用DI添加Service的三種方法
方式1(內聯注解,推薦使用):
- app.controller('myController', ['$scope', 'dateFilter', function ($scope, dateFilter) { }]);
方式2($inject注解):
- var MyController = function($scope, dateFilter) {}
- MyController.$inject = ['$scope', 'dateFilter'];
- someModule.controller('MyController', MyController);
方式3(隱式注解,不推薦使用):
- app.controller('myController', function ($scope, dateFilter) { });
推薦使用方式1的理由是:
寫法上比方法2更簡單明了
比方法3更可靠(由於Javascript可以被壓縮,AngularJS又是通過解析服務名稱找到對應Service的,因此Javascript壓縮之后AngularJS將無法找到指定的Service,但字符串不會被壓縮,因此單獨以字符串指定Service的名稱可以避免這個問題)
使用方式1或方式2的注意點:
由於上述第二點原因,AngularJS在編譯Html時,由$injector將數組中Service的名稱與方法體中的Service進行一一映射。這種映射關系必須遵守由AngularJS的約定:
數組中Service名稱的個數必須與方法體中Service名稱的個數一致
數組中Service的順序必須與方法體中Serivce的順序一致
(3)什么時候適合使用service()方法
service()方法很適合使用在功能控制比較多的service里面
注意:需要使用.config()來配置service的時候不能使用service()方法
(4)service使用實例
一個完整實例:
- <!DOCTYPE html>
- <html lang="zh" ng-app="myApp">
- <head>
- <meta charset="UTF-8">
- <title>AngularJS學習</title>
- <script type="text/javascript" src="./1.5.3/angular.min.js"></script>
- </head>
- <body>
- <div ng-controller="myCtrl">
- <button ng-click="getPrivate()">按鈕一</button>
- <button ng-click="getPUbluc()">按鈕二</button>
- </div>
- <div ng-controller = "myCtrl2">
- </div>
- </body>
- <script type="text/javascript">
- var app = angular.module('myApp', []);
- app.controller('myCtrl', function($scope, myService) {
- $scope.getPrivate = function() {
- alert(myService.getPrivate());
- };
- $scope.getPUbluc = function() {
- alert(myService.variable);
- };
- });
- app.controller('myCtrl2', function($scope, myService) {
- });
- app.service('myService', function() {
- console.log('instance myService');
- var privateValue = "I am Private";
- this.variable = "This is public";
- this.getPrivate = function() {
- return privateValue;
- };
- });
- </script>
- </html>
效果如下:
二、Factory使用詳解
- <!DOCTYPE html>
- <html lang="zh" ng-app="myApp">
- <head>
- <meta charset="UTF-8">
- <title>AngularJS學習</title>
- <script type="text/javascript" src="./1.5.3/angular.min.js"></script>
- </head>
- <body>
- <div ng-controller="myCtrl">
- <button ng-click="getPrivate()">按鈕一</button>
- <button ng-click="getPUbluc()">按鈕二</button>
- </div>
- <div ng-controller = "myCtrl2">
- </div>
- </body>
- <script type="text/javascript">
- var app = angular.module('myApp', []);
- app.controller('myCtrl', function($scope, myFactory) {
- $scope.getPrivate = function() {
- alert(myFactory.getPrivate());
- };
- $scope.getPUbluc = function() {
- alert(myFactory.variable);
- };
- });
- app.controller('myCtrl2', function($scope, myFactory) {
- });
- app.factory('myFactory', function() {
- console.log('instance myFactory');
- var factory = {};
- var privateValue = "I am Private";
- factory.variable = "This is public";
- factory.getPrivate = function() {
- return privateValue;
- };
- return factory;
- });
- </script>
- </html>
三、provider使用詳解
- <!DOCTYPE html>
- <html lang="zh" ng-app="myApp">
- <head>
- <meta charset="UTF-8">
- <title>AngularJS學習</title>
- <script type="text/javascript" src="./1.5.3/angular.min.js"></script>
- </head>
- <body>
- <div ng-controller="myCtrl1">
- <button ng-click = "onclick1()">請點擊我1</button>
- </div>
- <div ng-controller="myCtrl2">
- <button ng-click = "onclick2()">請點擊我2</button>
- </div>
- </body>
- <script type="text/javascript">
- var app = angular.module('myApp', []);
- app.controller('myCtrl1', function($scope, testProvider) {
- $scope.onclick1 = function() {
- testProvider("林炳文Evankaka");
- };
- });
- app.controller('myCtrl2', function($scope , testProvider) {
- $scope.onclick2 = function() {
- testProvider("我到底是誰");
- };
- });
- app.provider('testProvider', function(){
- console.log('instance testProvider');
- var f = function(name) {
- alert("Hello, " + name);
- };
- this.$get = function(){ //一定要有!
- return f;
- };
- });
- </script>
- </html>
- <!DOCTYPE html>
- <html lang="zh" ng-app="myApp">
- <head>
- <meta charset="UTF-8">
- <title>AngularJS學習</title>
- <script type="text/javascript" src="./1.5.3/angular.min.js"></script>
- </head>
- <body>
- <div ng-controller="myCtrl1">
- <button ng-click="onclick1()">請點擊我1</button>
- </div>
- <div ng-controller="myCtrl2">
- <button ng-click="onclick2()">請點擊我2</button>
- </div>
- </body>
- <script type="text/javascript">
- var app = angular.module('myApp', []);
- app.controller('myCtrl1', function($scope) {
- /* $scope.onclick1 = function() {
- test("林炳文Evankaka");
- };*/
- });
- app.controller('myCtrl2', function($scope) {
- /* $scope.onclick2 = function() {
- test("我到底是誰");
- };*/
- });
- app.provider('test', function() {
- console.log('instance test');
- var f = function(name) {
- alert("Hello, " + name);
- };
- this.$get = function() { //一定要有!
- return f;
- };
- });
- /*app.config(function(testProvider) {
- testProvider('I am config');
- });*/
- app.config(function($provide) {
- $provide.provider('greeting', function() {
- this.$get = function() {
- return function(name) {
- alert("Hello," + name);
- };
- };
- });
- /* greetingProvider('ff');*/
- });
- </script>
- </html>
(1)當我們希望在應用開始前對service進行配置的時候就需要使用到provider()。比如,我們需要配置services在不同的部署環境里面(開發,演示,生產)使用不同的后端處(2)理的時候就可以使用到了
當我們打算發布開源provider()也是首選創建service的方法,這樣就可以使用配置的方式來配置services而不是將配置數據硬編碼寫到代碼里面。
四、Service、Factory、Provider三者區別
- <!DOCTYPE html>
- <html lang="zh" ng-app="myApp">
- <head>
- <meta charset="UTF-8">
- <title>AngularJS學習</title>
- <script type="text/javascript" src="./1.5.3/angular.min.js"></script>
- </head>
- <body>
- <div ng-controller="myCtrl">
- <p>{{ output1 }}</p>
- <p>{{ output2 }}</p>
- <p>{{ output3 }}</p>
- </div>
- <div ng-controller="myCtrl2">
- </div>
- </body>
- <script type="text/javascript">
- var app = angular.module('myApp', []);
- app.controller('myCtrl', function($scope,testService, testFactory, testProvider) {
- $scope.output1 = testService.lable;
- $scope.output2 = testFactory.lable();
- $scope.output3 = testProvider;
- });
- app.controller('myCtrl2', function($scope,testService, testFactory, testProvider) {
- });
- app.service('testService',function(){
- console.log('instance testService');
- this.lable = 'this is service';
- });
- app.factory('testFactory', function () {
- console.log('instance testFactory');
- return{
- lable: function(){
- return 'this is factory';
- }
- };
- });
- app.provider('testProvider', function(){
- console.log('instance testProvider');
- this.$get = function(){
- return 'this is provider';
- };
- });
- </script>
- </html>
