一、什么是服务
在angular中,我们一般会把控制器中一些公共的部分抽出来,写成一个服务。比如在form表单里的上传、http请求等,很多地方都会用到,把这些代码抽成一个服务会使得我们的代码更加模块化,更加的便于维护。
二、怎么去写服务
angular为我们提供了一些内置的服务,但同时我们在一些面对一些较为复杂的应用时,需要去封装自己的服务,甚至进一步封装NG所提供的内置服务,比如在下面的http服务。
示例:
define(function(require){ var app = require('app'); /*http服务*/ app.factory('http',['$q','$http','$state','$timeout','utils',function($q,$http,$state,$timeout,utils){ return function(url,settings){ var deferred = $q.defer(); var settings = settings || {}, type = settings.type || 'json', url = ( type == 'jsonp' ) ? url + '&call_back=JSON_CALLBACK' : url; if( type === 'jsonp' ){ $http.jsonp(url).success(function(data){ deferred.resolve(data); }).error(function(reason){ deferred.reject(reason); }); }else{ $http({ url : url, method : settings.method || 'get', data : settings.data || null, params : settings.params || null, responseType : type, // headers:{ // "Content-Type": 'multipart/form-data' // } }).success(function(data){ if( data.error_code ){ utils.error( data.error_message ); } deferred.resolve(data); }).error(function(reason){ if( reason ){ !settings.error_nonotice && reason.error_code && utils.error( reason.error_message ); if(reason.error_code == 1000 && $state.$current.name != 'layout_for_push.userlogin'){ $timeout( function(){ // window.location.href = config.API.login; $state.go('layout_for_push.userlogin'); },1500 ); } deferred.reject(reason); } }).catch(function(reason){ if( reason ){ !settings.error_nonotice && reason.error_code && utils.error( reason.error_message ); deferred.reject(reason); } }); } return deferred.promise; }; }]);
angular封装自己的服务是非常简单的,我们只需要注册这个服务,在服务里面把我们的function给return出来就可以了。
三、如何使用服务
知道了服务的作用和创建,那我们应该如何使用它呢?其实也是很简单的,我们可以在控制器、指令或另外一个服务中通过依赖声明的方式来使用。
示例:
<!doctype html>
<html ng-app="ng-App">
<head>
<title>angular的服务</title>
<script src="angular.js"></script>
<script src="http.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="userCtrl">
<div class="user-center">
<span class="user-icon"><img src="{{vm.user.pic}}" /></span>
<span class="user-name">{{vm.user.name}}</span>
</div>
</div>
</body>
</html>
四、angular所提供创建服务的三种方式
angular一共提供了三种创建服务的方法,分别是factory、service、provider。
- factory需要接受两个参数:name、fun
angular.module('app',[]).factory('serviceName',function(){ return function(){ //do something }; }; }); - provider
angular.module('app',[]).provider('serviceName',function(){ this.setUrl = function(){}; this.$get = function( $http ){ //依赖注入在此加入 return { getUser : function(){} }; }; }); - service
angular.module('app',[]).service('serviceName',function(){ this.getUser = function(){}; });
其实三种写法都是provider,只是方式不一样,适合不同口味的人,让你写起来更爽一点,总有一款适合你。