AngularJS:如何避免多次调用服务

时间:2016-03-14 12:51:37

标签: angularjs angularjs-service

我们说我的申请中有4个观点。 主页,产品,登录,上传

目前我在登录视图中,登录后我被重定向到产品视图。 现在,对于产品视图,我有一个类似下面的指令控制器函数

function directiveController(){
 var self=this;
 init();

function init(){
 service.getProducts(parameter1, parameter2, successCallback, error);
}  

}

service.getProducts()将调用该服务并显示产品。现在问题是假设我在上传视图或任何其他视图,我再次转向产品视图此服务正在反复调用。我不想要它,我希望在登录到应用程序后,这个服务应该只被调用一次,而不是每次都被调用。

我不想在我的应用程序中的任何位置使用$rootScope来实现此功能。

任何帮助,想法和建议都表示赞赏。

由于

2 个答案:

答案 0 :(得分:2)

有一种factory/service类似activeModel,它会保存getProducts api调用的值,然后你可以检查activeModel是否包含某些数据,然后你就不会打电话..否则你会打电话给api。

(function () {
    'use strict'

    angular.module('your-module')
        .factory('activeModel', activeModel);

    function activeModel(){

            var activeModel = {};    
            activeModel = {
                products   : {},                    
            };

            return activeModel;

     }
})();

然后在你的init方法中,你可以像这样检查..

function init(){
 if(!Object.keys(activeModel.products).length > 0){
     //or you can check for some properties/values too here..
     service.getProducts(parameter1, parameter2, successCallback, error);
 }
}

另一个更简单的解决方案是通过将api调用抽象到controller来将api调用移至factory/service

答案 1 :(得分:0)

您可以使用Angular缓存来存储特定时间段的数据:https://docs.angularjs.org/api/ng/service/ $ cacheFactory

通过这种方式,您可以根据自己的需要或需要缓存这些内容来实现逻辑。

var cache = $cacheFactory('service-name-cache'),
    cacheKey = someSessionHash + elementKey,
    data = cache.get(cacheKey;

if (!data) {
   service.getProducts().success(function(result) {
      data = result;
      cache.put(cacheKey, data);
   });