1

我正在用角度 js 工厂方法编写一个权限函数来检查用户角色。如果用户对象具有这样的角色,那么结果应该为真,否则它应该返回假。我的用户对象是:

administrator:true 
company_admin:true 
registered:true 
manager:true
contact:"987654321" email:"abcd@gmail.com" name:"Anand"

应用模型工厂中的 My Permission 功能是:

$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.如果该数组中有多个角色具有“全部必需”条件,则检查用户对象中是否存在多个角色并返回真,否则返回假。

 $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);

上面的代码对于单个角色检查运行良好,但在使用“全部必需”或非“全部必需”条件进行多角色检查的情况下,它不能正常工作并返回 false。

4

1 回答 1

0

我不相信您可以使用 a 来摆脱 AngularJS 的 forEach ,return因为它可以替代类似于forEach

来自 MDN:

除了抛出异常之外,没有其他方法可以停止或中断 forEach() 循环。

在您的第return true一个循环仍在进行之后,实际上并没有导致建立内部返回语句,而是从循环中掉入return $requireAll;您的示例中,在您的示例中,这就是false您所看到的语句。

您可以通过在每个 return 语句之前放置调试来看到这一点,并看到它们在return.

通过使用一些,我重写了你逻辑以避免使用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));

于 2017-05-20T09:18:19.783 回答