1. 程式人生 > 其它 >AngularJS中使用service,並同步資料

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中呼叫:

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這樣寫:

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這樣呼叫:

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

如此實現了資料同步呼叫。