在angularjs指令中只调用一次rest服务
我们有可以根据角色显示的菜单。我为这个特性制定了指令。但问题是每次我调用该指令时,它都在调用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(){
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;也许你可以编辑你的答案。