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

在angularjs指令中只调用一次rest服务,angularjs,rest,angularjs-directive,Angularjs,Rest,Angularjs Directive,我们有可以根据角色显示的菜单。我为这个特性制定了指令。但问题是每次我调用该指令时,它都在调用rest服务。我希望能够只调用它一次,保存当前角色可以访问的功能,并决定隐藏或显示它。以下是我目前拥有的: var app = angular.module('myApp', []); app.service('authService', function(){ var user = {}; user.role = 'guest'; return{ getFeature: function(){

我们有可以根据角色显示的菜单。我为这个特性制定了指令。但问题是每次我调用该指令时,它都在调用rest服务。我希望能够只调用它一次,保存当前角色可以访问的功能,并决定隐藏或显示它。以下是我目前拥有的:

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();           
        }
       });
    }
  }
 });

我是否可以只调用一次rest服务而不是每次指令调用?

一种可能是缓存服务调用的结果,如下所示

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;
                });
            }
        }
    }
});
您将只进行一次调用(只要结果真实),然后返回缓存

可能会考虑如何根据应用程序的需要在某个时间点缓存缓存。


编辑

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

这种方法总是返回一个单一的承诺,它本身执行单个rest调用

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;
        }
    }
});

一种可能是缓存服务调用的结果,如下所示

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;
                });
            }
        }
    }
});
您将只进行一次调用(只要结果真实),然后返回缓存

可能会考虑如何根据应用程序的需要在某个时间点缓存缓存。


编辑

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

这种方法总是返回一个单一的承诺,它本身执行单个rest调用

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;
        }
    }
});

Wierd,它总是进入else循环。您是否尝试过在“cache=val”行上放置一个断点,以查看它是否执行过?featureList可能抛出了一个永远不会被捕获的错误。是的,它正在执行,问题是当我在if循环之前为cache放置一个console语句时,它调用n次说“未定义”,然后在else循环中调用rest服务n次(取决于指令调用)。啊,对。如果所有指令同时编译,那么承诺还没有解决,所以缓存将为空。我将对它进行编辑,但需要做一些更改。我就是这样做的:如果(!prom){prom=$http.get(/rest/)。然后(函数(result){return result.data;});}返回prom;也许你可以编辑你的答案。维尔德,它总是进入else循环。你有没有试过在“cache=val”行上放一个断点,看看它是否执行过?featureList可能抛出了一个永远不会被捕获的错误。是的,它正在执行,问题是当我在if循环之前为cache放置一个console语句时,它调用n次说“未定义”,然后在else循环中调用rest服务n次(取决于指令调用)。啊,对。如果所有指令同时编译,那么承诺还没有解决,所以缓存将为空。我将对它进行编辑,但需要做一些更改。我就是这样做的:如果(!prom){prom=$http.get(/rest/)。然后(函数(result){return result.data;});}返回prom;也许你可以编辑你的答案。