AngularJS中使用service,并同步数据

简介:

service是单例对象,在应用中不同代码块之间共享数据。

对一些公用的方法封装到service中,然后通过依赖注入在Controller中调用,示例代码:

1.创建一个模块:

var module = angular.module( "my.new.module", [] );

2.创建一个service服务:

复制代码
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中调用:

复制代码
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数据:

复制代码
 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中调用:

1
2
3
4
5
6
7
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这样写:

1
2
3
4
5
6
7
8
9
10
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这样调用:

1
2
3
4
VService.getCode($scope.mobile).then(function(data){
      $scope.s=data;
      console.log("s==="+JSON.stringify($scope.s));
})

如此实现了数据同步调用。  


本文转自Ryan.Miao博客园博客,原文链接:http://www.cnblogs.com/woshimrf/p/4590670.html,如需转载请自行联系原作者  

 

相关文章
angularJS的controller之间如何正确的通信
angularJS的controller之间如何正确的通信
47 0
|
JavaScript 前端开发
实战之AngularJS 的Scope和Service的深入应用心得
实战之AngularJS 的Scope和Service的深入应用心得
实战之AngularJS 的Scope和Service的深入应用心得
|
Java C#
angularJS学习小结——service
angularJS学习小结——service
95 0
|
前端开发 数据库 容器
AngularJS自定义服务(factory、service、provider)
AngularJS自定义服务(factory、service、provider)
|
监控 JavaScript 前端开发
|
JavaScript 前端开发 API
|
监控 JavaScript 前端开发
|
JavaScript 容器 前端开发