我正在开发一个与后端的 REST 服务器一起工作的 SPA。
我的目标是创建一个界面,这对所有角色都是相互的。
例如:在产品页面上,客人可以查看产品和评论,注册用户也有一个可以评论的文本框。管理员可以编辑评论和自己的产品,一切都在 SPA 的同一视图中完成。
所以实际上我们有 DOM 元素不应该为某些用户“编译”,但应该为其他用户“编译”。
为了控制对我的应用程序的访问,我正在做的是解决一个工厂,该工厂授予该用户有足够的权限来访问某个页面,该工厂还使用他的访问级别填充 rootScope。
然后在 xLimitAccess 指令的编译功能上,我检查当前用户的访问级别是否足以查看指令中的内容,然后将其删除。
问题:无法从 compile 函数中访问 $rootScope(因为它还不存在),如果我在链接函数中这样做,已经太晚了,并且无法从中删除元素DOM
HTML 代码示例:
<div class="product">...</div>
<div class="manageProduct" x-limit-access x-access-level="admin">...</div>
<div class="commnet" x-limit-access x-access-level="user, admin">...</div>
<div class="commnet" x-limit-access x-access-level="admin">...</div>
Javascript代码:
var app = angular.module('home', []);
// var host = 'http://127.0.0.1:8000';
app.config(function($routeProvider){
$routeProvider.
when('/',
{
templateUrl: 'views/home.html',
controller: 'homeCtrl',
resolve: {auth : 'authUser'} //this is a page only for logged in users
}).
when('/login',
{
templateUrl: 'views/login.html',
controller: 'loginCtrl',
resolve: {}
}).
when('/logout',
{
templateUrl: 'views/logout.html',
controller: 'logoutCtrl',
resolve: {auth : 'authUser'} //this is a page only for logged in users
}).
when('/register',
{
templateUrl: 'views/register.html',
controller: 'registerController',
resolve: {}
}).
when('/admin',
{
templateUrl: 'views/admin/home.html',
controller: 'registerController',
resolve: {auth: 'authAdmin'}
}).
otherwise({ redirectTo: '/'});
// $locationProvider.html5Mode(true);
}).
run(function($rootScope, $location, $http, authUser){
$rootScope.$on("$routeChangeError", function(event, current, previous, rejection){
if(rejection.status == 401)
$location.path('/login');
})
$http.get('/users/me', {withCredentials: true}).
success(function(data, status, headers, config){
$rootScope.roles = data.roles;
}).
error(function(data, status, headers, config){
});
});
app.factory('authUser', function($http){
return $http.head('/users/me', {withCredentials: true});
});
app.directive('xLimitAccess', function(){
return{
restrict: 'A',
prioriry: 100000,
scope: {
xAccessLevel: '='
}
compile: function(element,$rootScope){//this is essentially the problem
if(scope.xAccessLevel != $rootScope.roles)
element.children().remove();
elemnet.remove();
}
}
})