gpt4 book ai didi

angularjs - 根据用户的 Angular 色在单个 View 中显示不同的内容

转载 作者:行者123 更新时间:2023-12-03 09:23:03 26 4
gpt4 key购买 nike

假设我们的 Angular SPA 应用程序中有一个菜单,现在我希望向所有用户显示基本选项,例如家庭、关于我们、运营商机会等。

我还想有其他几个选项,例如管理用户、管理帖子等,这些选项只会显示给管理员。

我们还假设我们有一个 API 访问点,它为我提供用户 Angular 色,或者更好的是,用户 Angular 色位于从/api/users/me 检索的对象中。

什么是封装这些管理工具不被普通用户查看的最佳方式?

View 之间是否存在某种继承?就像在 Django 中一样?,有没有办法对未经授权的用户隐藏 DOM 元素?(是的,我知道它是客户端)。

我真的不想为菜单使用不同的 View ,因为它应该是一个通用组件。

我想如果我之前所有问题的答案是否定的,那么剩下的问题是:什么是最好的实现?自定义指令(“E”+“A”)
说:

<limitedAccss admin>Edit page</limitedAccess>
<limitedAccss user>view page</limitedAccess>

或者可能只是在用户对象上使用带有条件的常规 ng-show?

最佳答案

解决方案在这个 fiddle 中:

http://jsfiddle.net/BmQuY/3/

var app = angular.module('myApp', []);

app.service('authService', function(){

var user = {};
user.role = 'guest';
return{
getUser: function(){
return user;
},
generateRoleData: function(){
/* this is resolved before the
router loads the view and model.
It needs to return a promise. */
/* ... */
}
}
});

app.directive('restrict', function(authService){
return{
restrict: 'A',
priority: 100000,
scope: false,
compile: function(element, attr, linker){
var accessDenied = true;
var user = authService.getUser();

var attributes = attr.access.split(" ");
for(var i in attributes){
if(user.role == attributes[i]){
accessDenied = false;
}
}


if(accessDenied){
element.children().remove();
element.remove();
}


return function linkFn() {
/* Optional */
}
}
}
});

如果要在 IE 7 或 8 中使用此指令,则需要手动删除元素的子元素,否则将抛出错误:
  angular.forEach(element.children(), function(elm){
try{
elm.remove();
}
catch(ignore){}
});

可能的用法示例:
<div data-restrict access='superuser admin moderator'><a href='#'>Administrative options</a></div>

使用 Karma + Jasmine 进行单元测试:
关注: done回调函数仅适用于 Jasmine 2.0,如果您使用的是 1.3,则应使用 waitsFor反而。
  describe('restrict-remove', function(){
var scope, compile, html, elem, authService, timeout;
html = '<span data-restrict data-access="admin recruiter scouter"></span>';
beforeEach(function(){
module('myApp.directives');
module('myApp.services');
inject(function($compile, $rootScope, $injector){
authService = $injector.get('authService');
authService.setRole('guest');
scope = $rootScope.$new();
// compile = $compile;
timeout = $injector.get('$timeout');
elem = $compile(html)(scope);
elem.scope().$apply();
});
});
it('should allow basic role-based content discretion', function(done){
timeout(function(){
expect(elem).toBeUndefined();
done(); //might need a longer timeout;
}, 0);
});
});
describe('restrict-keep', function(){
var scope, compile, html, elem, authService, timeout;
html = '<span data-restrict data-access="admin recruiter">';
beforeEach(function(){
module('myApp.directives');
module('myApp.services');
inject(function($compile, $rootScope, $injector){
authService = $injector.get('authService');
timeout = $injector.get('$timeout');
authService.setRole('admin');
scope = $rootScope.$new();
elem = $compile(html)(scope);
elem.scope().$apply();
});
});

it('should allow users with sufficient priviledsges to view role-restricted content', function(done){
timeout(function(){
expect(elem).toBeDefined();
expect(elem.length).toEqual(1);
done(); //might need a longer timeout;
}, 0)
})
});

元素的通用访问控制指令,不使用 ng-if(仅自 V1.2 起 - 当前不稳定)或 ng-show 实际上并未从 DOM 中删除元素。

关于angularjs - 根据用户的 Angular 色在单个 View 中显示不同的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18043412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com