0

我正在寫一個角度js工廠方法的權限函數,它檢查用戶角色。如果用戶對象有這樣的角色,那麼結果應該是true,否則它應該返回false。 我的用戶對象是:如何檢查數組中的任何值是否存在於角度js中的另一個數組中?

administrator:true 
company_admin:true 
registered:true 
manager:true 
contact:"987654321" email:"[email protected]" 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; 
     } 

有以下這我檢查情況: 如果有多個在'required all'條件中將數組作用於該數組,然後檢查用戶對象中存在多個角色並返回true,否則返回false。

$result= $appModel.checkPermission([registered, company_admin], true); 

2.如果有數組中的多個角色,然後檢查這些多重角色出現在用戶對象,如果任何作用得到匹配,則返回true,否則返回false。

$result= $appModel.checkPermission([administrator, company_admin,manager,agent], false); 

如果有數組中的一個角色,然後檢查角色存在於用戶對象,如果那個角色得到匹配,則返回true,否則返回false。

$result= $appModel.checkPermission(register, false); 

上面的代碼運行良好的單一角色檢查,但在多角色與檢查案「所需的所有」或不「所需的所有」條件下,它不能正常工作並返回false。

回答

0

我不相信你可以使用return來突破AngularJS的forEach,因爲它可以替代類似forEach

從MDN:

有沒有辦法阻止或破壞不是拋出一個異常以外的foreach()循環。

你的第一個return true循環後仍進行着,實際上沒有造成要建立內部return語句,跌出了循環到你return $requireAll;其中,在你的例子,是false陳述你所看到的。

您可以通過在每個return語句之前放置調試並在return之後看到它們繼續觸發來看到這一點。

通過使用someevery我改寫了你的邏輯,以避免使用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));

+0

另外,你的最後一行'如果(data.hasOwnProperty(角色)&&數據[作用])'將如果角色不存在失敗。我已通過返回有條件檢查解決此問題 – user2340824

+0

感謝兄弟!它工作得非常好。自從最近兩天以來,我對它的處理非常忙碌。你爲我節省了很多時間。萬分感謝。 @ user2340824 – Hemant

+0

樂於助人,真高興它的工作! – user2340824

相關問題