在angularjs指令中仅调用一次rest服务

时间:2015-04-21 23:04:31

标签: angularjs rest angularjs-directive

我们有可以根据角色显示的菜单。我为这个功能制定了指令。但问题是每次我将该指令称为其调用休息服务。我希望能够只调用一次并保存当前角色可以访问的功能,并决定隐藏它还是显示。以下是我现在所拥有的:

var app = angular.module('myApp', []);

app.service('authService', function(){

var user = {};
user.role = 'guest';
return{
getFeature: function(){
  //rest service call
  return featureList;
 },

  }
});

app.directive('restrict', function(authService){
  return{
    restrict: 'A',
    prioriry: 100000,
    scope: false,
    compile:  function(element, attr, linker){
        var accessDenied = true;
        var featureList = authService.getFeature();
        featureList.then(function(result){
          featureList = result;

        var attributes = attr.access.split(" ");
        for(var i in featureList){
            if(featureList[i] == attributes[0]){
                accessDenied = false;
            }
        }


        if(accessDenied){
            element.children().remove();
            element.remove();           
        }
       });
    }
  }
 });

无论如何,我只能在每次指令呼叫时只拨打一次休息服务吗?

1 个答案:

答案 0 :(得分:4)

一种可能性是缓存服务调用的结果,如此

app.service('authService', function($q) {

    var user = {};
    var cache;

    user.role = 'guest';
    return {
        getFeature: function() {
            if (cache) {
                return $q.when(cache);
            } else {
                //rest service call
                return featureList.then(function(val) {
                    cache = val;
                    return val;
                });
            }
        }
    }
});

您只会拨打一次电话(只要结果是真实的),之后您就会返回缓存。

可能会考虑如何在某些时候使缓存无效,具体取决于应用程序的需求。


修改

根据评论,先前的解决方案将允许在等待承诺解决时进行多次调用。

这种方法总会返回一个单一的承诺,它本身会进行单次休息。

app.service('authService', function($http) {

    var user = {};
    var prom;

    user.role = 'guest';
    return {
        getFeature: function() {
            if (!prom) {
                prom = $http.get(/rest/).then(function(result) {
                    return result.data;
                });
            }
            return prom;
        }
    }
});