基于用户加载不同的controller/js文件'访问级别

load different controllers/js files based on users' access levels

本文关键字:js controller 文件 访问级别 于用户 用户 加载      更新时间:2023-09-26

我正在开发一个web应用程序,其中用户具有不同的访问级别。每个访问级别都有不同的控制器/视图集。

我正在使用ngRouteng-view。每个控制器都有自己的JS文件,它还包含该控制器的路由映射信息。每个控制器看起来像:

angular.module('MainApp', ['ngRoute'])
 .controller('ContollerX', function() {
 })
.config(function($routeProvider) {
  $routeProvider
  .when('/ControllerXURL', {
    templateUrl: 'ViewX.html',
    controller: 'ControllerX'
  });
});

(不确定这是否是最佳做法)

我不想提前加载所有的控制器。是否可以根据用户的访问级别(在他/她登录后确定)仅加载用户需要的控制器(从后端返回的用户访问级别数据)?什么是最好的方法?

我正在考虑动态加载控制器脚本,比如插入脚本标记。它行得通吗?AngularJs对此有任何内置功能吗?

在路由定义对象中使用resolve属性有一种更简单的方法可以实现您想要的内容。resolve返回一个promise,并且只有当该promise被解析时,使用解析的到控制器的路由才会被重定向。您可以使用它重定向到所需的视图。

假设您有两个视图:AuthorizedUsers.html和UnauthorizedUsers.html以及相应的控制器AuthorizedUsersController和UnauthorizedUsersContrller。您可以将这些视图的路线定义如下:

 angular
   .module('MainApp', ['ngRoute'])
   .controller('AuthorizedUsersController', function(auth) {
   })
   .controller('UnauthorizedUsersController', function() {
   })
   .config(function($routeProvider) {
     $routeProvider
       .when('/authorizedusers', {
         templateUrl: 'AuthorizedUsers.html',
         controller: 'AuthorizedUsersController',
         resolve: {
           auth: function ($q, $location) { 
             var defer = $q.defer();
             if (isAuthorized) {
               defer.resolve();
             } else {
               $location.path('/unauthorized');
               defer.reject();
             }
             return defer.promise;
           }
         }
       })
       .when('/unauthorizedusers', {
         templateUrl: 'UnauthorizedUsers.html',
         controller: 'UnauthorizedUsersController'
       });
   });