資深架構師的 AngularJS服務

認真期待發表於2018-05-07

AngularJS的service層用於處理業務邏輯和資料持久化,以下3鍾方法可以建立並註冊我們自己的service,在控制器中注入已建立的service服務,就可以呼叫service裡面的屬性和方法了。

1、Factory

2、Service

3、Provider

1、最簡單的方式:Factory工廠方法

Angular裡建立service最簡單的方式就是使用factory()方法,使用factory()來建立服務的時候,首先建立一個物件,然後在這個物件上新增屬性,最後返回這個物件。把這個服務注入控制器中,控制器就可以訪問物件上的方法了。

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .factory('playerFactory',function(){

  3. var _players = [

  4. {"username":"zhangsan",'address':'北京'},

  5. {"username":"lisi",'address':'上海'},

  6. {"username":"wangwu",'address':'大連'}

  7. ];

  8. var service = {};

  9. service.getPlayers = function(){

  10. return _players;

  11. }

  12. return service;

  13. });

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .controller('PlayerCtrl', function ($scope,$http,$filter,playerFactory) {

  3. $scope.playName = $filter('lowercase')('Angular');

  4. $scope.players = playerService.getPlayers();

  5. console.log(players);

  6. })

2、最直接的方式:Service建構函式方法

service()與factory用法差不多,區別在於不需要返回一個物件。

使用service()建立服務時,相當於使用new關鍵字進行了例項化,只需要在this上新增屬性和方法,然後服務會自動返回this。把這個服務注入控制器中,控制器就可以訪問物件上的屬性方法了。

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .service('playerService', function(){

  3. this.getRemotePlayers = function(){

  4. var deferred = $q.defer();

  5. $http({

  6. method: 'JSONP',

  7. url: 'url'+'&callback=JSON_CALLBACK'

  8. }).success(function(data, status) {

  9. deferred.resove(data);

  10. }).error(function(data, status) {

  11. deferred.reject('error');

  12. });

  13. return deferred.promise;

  14. }

  15. })

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .controller('PlayerCtrl', function ($scope,$http,$filter,playerService) {

  3. $scope.players = playerService.getRemotePlayers();

  4. console.log(players);

  5. })

3、最通用的方式:Provider方法

provider是唯一一種可以建立用來注入到config()函式的服務的方式。如果要在service物件啟動之前先進行模組範圍的配置,應使用Provider。

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .provider('playerProvider',function(){

  3. this._players = [

  4. {"username":"zhangsan",'address':'北京'},

  5. {"username":"lisi",'address':'上海'},

  6. {"username":"wangwu",'address':'大連'}

  7. ];

  8. this.paramFromConfig = '';

  9. this.$get = function(){

  10. var that = this;

  11. return{

  12. getPlayers: function(){

  13. return that._players;

  14. },

  15. paramOnConfig: that.paramFromConfig

  16. }

  17. }

  18. })

  19. .config(function(playerProviderProvider){

  20. playerProviderProvider.paramFromConfig = 'param from config';

  21. })

[javascript] view plain copy

  1. angular.module('yeomanAngularApp')

  2. .controller('PlayerCtrl', function ($scope,$http,$filter,playerProvider) {

  3. $scope.playName = $filter('lowercase')('Angular');

  4. $scope.players = playerService.getPlayers();

  5. console.log(players);

  6. })

  7. 在此我向大家推薦一個架構學習交流群。交流學習群號: 744642380, 裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良


相關文章