我正在尝试编写指令 将评估用户权限。
如果不允许用户查看给定内容
内容不会显示(已完成,工作正常)
来自权限指令内的控制器的请求将无法获取 烧成。
示例:
控制器:
function MyController ($scope){
// performing imediately server request, witch is allowed only for admin
// therefore i will get error when non admin user access this page
}
权限指令:
return {
priority: 1000,
restrict: 'E',
link: (scope, element, attrs) => {
var permission = attrs.permission;
if (/*evaluating permission*/) {
// user has permission, no work for me
return;
}
element.remove();
}
};
所有在一起:
<permission permission="isAdmin">
<div ng-controller="MyController">
</div>
</permission>
此版本正在从DOM中删除元素,但MyController中的请求仍然会被执行。当然,我可以在MyController中检查权限,但我不想。
感谢您的帮助。
答案 0 :(得分:2)
您的问题是在链接功能执行之前始终会调用控制器。请参阅this fiddle。
function MyCtrl($scope) {
console.log('in controller');
}
myApp.directive('permission', function() {
return {
restrict: 'E',
link: function(scope, element, attrs) {
console.log('in link');
日志显示:
in controller
in link
答案 1 :(得分:1)
我尝试了另一种方法并将元素删除到编译函数中。根据日志,它是在控制器之前执行的,所以它是正确的地方。无论如何,请求仍然被解雇。所以我尝试了一个盲目的删除元素儿童(我知道,它没有意义,删除元素应该是足够的,应该删除孩子也。)
但它有效!
compile: function(element) {
var children = element.children();
children.remove(); element.remove();
}
它正在运作,但我不确定它有多好(例如未来的版本Ang。)
答案 2 :(得分:-1)
如果我是你,我会打电话给服务器并检查他们是否有权访问。
使用指令执行此操作并不合理。
指令通常用于操作dom,这是授权确认通常应该在控制器中处理,然后让触发器的结果成为事件。
然后让你的指令监听该事件,并在他们从服务器获得访问权限时操纵dom。
否则,任何人都可以轻松地注入他们想要的任何内容并查看您的管理面板。
如果您不确定我的意思,请告诉我如果您需要,我可以扩大答案。