我正在角度js工厂方法中编写一个权限函数来检查用户角色。如果用户对象具有此角色,则结果应为true,否则应返回false。 我的用户对象是:
administrator:true
company_admin:true
registered:true
manager:true
contact:"987654321" email:"abcd@gmail.com" name:"Anand"
应用模型工厂中的我的权限功能是:
$appModel.checkPermission:function($role, $requireAll) {
var data = $rootScope.authUser;
if (angular.isArray($role)) {
angular.forEach($role, function (value, key) {
var hasRole = $appModel.checkPermission(value); //Recursive Function
if (hasRole && !$requireAll) {
return true;
} else if (!hasRole && $requireAll) {
return false;
}
});
return $requireAll;
} else {
if (data.hasOwnProperty($role) && data[$role])
return true;
}
return false;
}
我正在检查以下案例: 1。如果该数组中有多个角色,其中包含'required all'条件,则检查用户对象中是否存在多个角色,否则返回true。
$result= $appModel.checkPermission([registered, company_admin], true);
2. 如果该数组中有多个角色,则检查用户对象中是否存在多个角色,如果任何角色匹配,则返回true,否则返回false。
$result= $appModel.checkPermission([administrator, company_admin,manager,agent], false);
3. 如果该数组中有单个角色,则检查该角色是否存在于用户对象中,如果该角色匹配,则返回true,否则返回false。
$result= $appModel.checkPermission(register, false);
上面的代码对于单个角色检查运行正常,但是如果使用“required all”或“required all”条件进行多个角色检查,它将无法正常工作并返回false。
答案 0 :(得分:0)
我不相信你可以使用return
打破AngularJS的forEach,因为它可以替代forEach。
来自MDN:
除了抛出异常之外,没有办法停止或破坏forEach()循环。
在你的第一个return true
循环仍然存在之后,实际上并没有导致内部return语句被建立,从循环中掉进你的return $requireAll;
中,在你的例子中,false
是{你看到的{1}}声明。
您可以通过在每个return语句之前放置调试,并在return
之后看到它们继续触发来看到这一点。
使用some和every我重写了您的逻辑以避免使用forEach
:
var results = $role.map($appModel.checkPermission);
return requireAll
? results.every(function(item) {return item;})
: results.some(function(item) {return item;})
} else {
return (data.hasOwnProperty(role) && data[role]);
}
以下代码段显示此代码仅使用JavaScript。
var roleChecker = function(role, requireAll) {
var data = {
administrator: true,
company_admin: true,
registered: true,
manager: true,
};
if( Object.prototype.toString.call(role) === '[object Array]' ) {
var results = role.map(roleChecker);
return requireAll ? results.every(function(item) {return item;})
: results.some(function(item) {return item;})
} else {
return (data.hasOwnProperty(role) && data[role]);
}
};
console.log(roleChecker(['administrator', 'manager'], false));
console.log(roleChecker(['administrator', 'company_admin', 'fake_role'], true));
console.log(roleChecker(['administrator', 'company_admin'], true));
console.log(roleChecker('administrator', false));
console.log(roleChecker('fake_role', false));