应用程序有两种类型的角色:'adam'和'eve'用户可以拥有一个或另一个角色.
角色服务来获得角色:
app.factory("AuthService",function($http, $q){
var user = undefined;
return {
getRoles : function(){
var deferred = $q.defer();
if(user !== undefined){
deferred.resolve(user.auth);
}else{
$http.get("./rest/auth", {
}).then(function(result){
user = result.data;
deferred.resolve(user.auth);
});
}
return deferred.promise;
}
};
});
Run Code Online (Sandbox Code Playgroud)
路由按如下方式完成:
myApp.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when("/adam", {
templateUrl: 'templates/adam.html',
controller: 'AController'
})
.when("/eve", {
templateUrl: 'templates/eve.html',
controller: 'BController'
})
.when("/", {
resolve: {
load : function($q, $location, AuthService){
var defer = $q.defer();
AuthService.getRoles().then(function(data){
if(data === 'adam'){
$location.path('/adam');
}else{
$location.path('/eve');
}
defer.resolve();
});
return defer.promise;
}
}
})
.otherwise({ redirectTo: '/' });;
}]);
Run Code Online (Sandbox Code Playgroud)
我需要在控制器中获得角色以执行某些操作.控制器代码:
angular.element(document).ready(function () {
AuthService.getRoles().then(function(data){
// some operation
});
});
Run Code Online (Sandbox Code Playgroud)
在导航到'/'时,ajax被调用两次,因为resolve和controller函数都调用了AuthService.getRoles().我如何重构代码,以便只调用一次ajax?
我会把你的工厂改成这样,这样他们就能做出同样的承诺:
app.factory("AuthService", function ($http, $q) {
var userPromise;
return {
getRoles : function () {
if(!userPromise){
userPromise = $http.get("./rest/auth", {}).then(function(result){
return result.data;
});
}
return userPromise;
}
};
});
Run Code Online (Sandbox Code Playgroud)
如果未设置,这会创建一个获取数据的承诺。此后的每次调用都会创建 Promise,因此它只会挂接到第一个调用,而不会进行后续调用。它对您不起作用的原因是因为您的用户仅在 $http.get 之后设置,因此第二次通过它仍然将其视为未定义。