zoukankan      html  css  js  c++  java
  • 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));
    })
    

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

      

  • 相关阅读:
    eclipse中Preferences的一些设置
    eclipse中文乱码问题解决方案
    classpath、path、JAVA_HOME的作用
    java中抽象类与接口中方法访问修饰符问题 (
    Tomcat配置
    编译型语言和解释型语言
    强类型语言和弱类型语言
    javascript生成指定范围的随机整数
    java中int和Integer的区别
    红黑树入门
  • 原文地址:https://www.cnblogs.com/woshimrf/p/4590670.html
Copyright © 2011-2022 走看看