我们有可以根据角色显示的菜单。我为这个功能制定了指令。但问题是每次我将该指令称为其调用休息服务。我希望能够只调用一次并保存当前角色可以访问的功能,并决定隐藏它还是显示。以下是我现在所拥有的:
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();
}
});
}
}
});
无论如何,我只能在每次指令呼叫时只拨打一次休息服务吗?
答案 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;
}
}
});