service是单例对象,在应用中不同代码块之间共享数据。
对一些公用的方法封装到service中,然后通过依赖注入在Controller中调用,示例代码:
1.创建一个模块:
代码语言:javascript复制var module = angular.module( "my.new.module", [] );
2.创建一个service服务:
代码语言:javascript复制module.service( 'Book', [ '$rootScope', function( $rootScope ) {
var service = {
books: [
{ title: "Magician", author: "Raymond E. Feist" },
{ title: "The Hobbit", author: "J.R.R Tolkien" }
],
addBook: function ( book ) {
service.books.push( book );
$rootScope.$broadcast( 'books.update' );
}
}
return service;
}]);
3.在Controller中调用:
代码语言:javascript复制1 var ctrl = [ '$scope', 'Book', function( scope, Book ) {
2 scope.$on( 'books.update', function( event ) {
3 scope.books = Book.books;
4 scope.$apply();
5 });
6 scope.books = Book.books;
7 }];
8
9 module.controller( "books.list", ctrl );
但是,当涉及到异步请求的时候,service的数据就可能会在controller调用的时候不同步,比如:
定义一个service,用来请求json数据:
代码语言:javascript复制 1 module.service('VService',['$http',function($http){
2 var service={
3 getCode:function(mobile){
4 var msg={};
$http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){
5 console.log("data==" JSON.stringify(data));
6 msg=data;
7 });
9 return msg;
10 }
12 }
13
14 return service;
15 }]);
在controller中调用:
代码语言:javascript复制module.controller("myCtrl",["$scope",$routeParams","VService",function($scope,$http,$routeParams,VService){
$scope.mobile=$routeParams.mobile;
$scope.getCapt = function(){
var s=VService.getCode($scope.mobile);
console.log(s);
};
}]);
这时候,控制台打印显示:data有数据,但是s为undefined。
具体原因我没去深究,大概猜测是异步请求数据的原因,因为第二次调用getCapt方法的时候s有数据了,所以通过内置服务$q来进行数据的同步调用:
service这样写:
代码语言:javascript复制var service={
getCode:function(mobile){
var deferred = $q.defer();//声明延后执行,表示要去监控后面的执行
$http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){
console.log("data==" JSON.stringify(data));
deferred.resolve(data);//声明执行成功,即http请求数据成功,可以返回数据了
}
);
return deferred.promise;//返回承诺,这里并不是最终数据,而是访问最终数据的API
}}
controller这样调用:
代码语言:javascript复制VService.getCode($scope.mobile).then(function(data){
$scope.s=data;
console.log("s===" JSON.stringify($scope.s));
})
如此实现了数据同步调用。