2016-01-22 25 views
0

新手到角度,使用服务我试图加载cachefactory并使用缓存从控制器。Angularjs控制器无法加载来自cachefactory服务的http数据

这里是服务方法

codesApp.service('CodeFilterService',function($filter, $http, CacheService,$log){ 
this.getByCodeType = function (codeTypeValue, codeName) { 
    if (angular.isUndefined(CacheService.get('Codes'))) { 
     loadCodes(); 
    } 
    return $filter('filter')(CacheService.get('Codes'), {codetype: codeTypeValue, name: '!' + codeName}); 
}; 

this.getAllCodes = function() { 
    $log.info("getAllCodes"); 
    if (angular.isUndefined(CacheService.get('Codes'))) { 
     $log.info("Loading fresh getAllCodes"); 
     this.loadCodes(); 
    } 
    return CacheService.get('Codes'); 
}; 

this.loadCodes = function() { 
    $http.get("./rest/codes").then(function (response) { 
     $log.info("Codes Size" +response.data.length); 
     CacheService.put('Codes', response.data); 
    }); 
    }; 
}); 

codesApp.factory('CacheService',function($cacheFactory){ 
    return $cacheFactory('super-cache'); 
}); 

控制器代码:

codesApp.controller('CodeCreateController',function($scope,$state, 
Code,CodeFilterService,$log){ 

    ... 
$scope.codeDropdownList = CodeFilterService.getAllCodes(); 
    $log.info("codeDropdownList = " + angular.isUndefined($scope.codeDropdownList)) ; 

}); 

这里angular.isUndefined($ scope.codeDropdownList))返回true,这意味着没有得到加载的数据。有什么办法可以解决这个问题。

+1

问题莱蒂简单... AJAX是异步的,所以你不能把'loadcodes()',并立即返回到控制器。可能要在控制器运行之前使用路由器中的加载缓存来加载缓存 – charlietfl

+0

@charlietfl谢谢,您能否提供答案或psedocode – vels4j

回答

0

您可以使用承诺注入$ Q

codesApp.service('CodeFilterService', function ($filter, $http, CacheService, $log, $q) { 

    this.getByCodeType = function (codeTypeValue, codeName) { 
     if (angular.isUndefined(CacheService.get('Codes'))) { 
      loadCodes(); 
     } 
     return $filter('filter')(CacheService.get('Codes'), { 
      codetype: codeTypeValue, 
      name: '!' + codeName 
     }); 
    }; 

    this.getAllCodes = function() { 
     $log.info("getAllCodes"); 
     var deferred = $q.defer(); 
     if (angular.isUndefined(CacheService.get('Codes'))) { 
      $log.info("Loading fresh getAllCodes"); 
      this.loadCodes().then(function (result) { 
       $log.error('getAllCodes success'); 
       var cachedCodes = CacheService.get('Codes'); 
       deferred.resolve(cachedCodes); 
      }, function (reason) { 
       $log.error('getAllCodes error: ' + reason); 
       deferred.reject(); 
      }); 
     } else { 
      var cachedCodes = CacheService.get('Codes'); 
      deferred.resolve(cachedCodes); 
     } 
     return deferred.promise; 
    }; 

    this.loadCodes = function() { 
     $log.info("loadCodes"); 
     var deferred = $q.defer(); 
     $http.get("./rest/codes").then(function (response) { 
      $log.error('loadCodes success'); 
      $log.info("Codes Size" + response.data.length); 
      CacheService.put('Codes', response.data); 
      deferred.resolve(); 
     }, function (reason) { 
      $log.error('loadCodes error: ' + reason); 
      deferred.reject(); 
     }); 
     return deferred.promise; 
    }; 
}); 




codesApp.controller('CodeCreateController', function ($scope, $state, 
    Code, CodeFilterService, $log) { 

    ... 
    CodeFilterService.getAllCodes().then(function (result) { 
     $log.info('result: ' + result); 
     $scope.codeDropdownList = result; 
     $log.info("codeDropdownList = " + angular.isUndefined($scope.codeDropdownList)) 
    }, function (reason) { 
     $log.error('error: ' + reason); 
    }); 

}); 
相关问题