gpt4 book ai didi

angularjs - 在我的应用程序启动后,如何在不使用 require.js 的情况下向我的应用程序添加模块?

转载 作者:行者123 更新时间:2023-12-04 21:41:59 25 4
gpt4 key购买 nike

我的 AngularJS 应用程序有一个模块 admin我希望仅对具有管理员 Angular 色的人员可用。在服务器上,我已将此模块的文件全部放在一个目录中,并且此 web-config 位于同一目录中。这有效,除非用户处于管理员 Angular 色,否则他们无法下载 javascript 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<authorization>
<remove users="*" roles="" verbs="" />
<add accessType="Allow" roles="Admin" />
</authorization>
</security>
</system.webServer>
</configuration>

所以我的服务器端解决方案似乎已经解决了。但是我完全不知道在客户端上做什么, 如何在启动后下载脚本并将模块添加到我的应用程序 .这是我所拥有的:

我使用 web-config 保护的 admin 目录中的文件如下所示:

管理员.js
angular.module('admin', [])

homeController.js
angular.module('admin')
.controller('AdminHomeController', ['$http', '$q', '$resource', '$scope', '_o', adminHomeController]);

function adminHomeController($http, $q, $resource, $scope, _o) {
....
...
}

我的应用程序级文件如下所示:

应用程序.js
var app = angular
.module('app',
['ui.router', 'admin', 'home',])
.run(['$rootScope', '$state', '$stateParams', '$http', '$angularCacheFactory', appRun])

function appRun($rootScope, $state, $stateParams, $http, $angularCacheFactory) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}

app.config.js
app.config(['$controllerProvider', '$httpProvider', '$locationProvider', '$sceProvider', '$stateProvider', appConfig]);

function appConfig($httpProvider, $locationProvider, $sceProvider, $stateProvider) {

// I added this to help with loading the module after
// the application has already loaded
app.controllerProvider = $controllerProvider;
//
$sceProvider.enabled(false);
$locationProvider.html5Mode(true);
var admin = {
name: 'admin',
url: '/admin',
views: {
'root': {
templateUrl: '/Content/app/admin/partials/home.html',
},
'content': {
templateUrl: '/Content/app/admin/partials/overview.html',
},
}
};
var adminContent = {
name: 'admin.content',
parent: 'admin',
url: '/:content',
views: {
'root': {
templateUrl: '/Content/app/admin/partials/home.html',
},
'content': {
templateUrl: function (stateParams) {
return '/Content/app/admin/partials/' + stateParams.content + '.html';
},
}
}
};
var home = {
name: 'home',
url: '/home',
views: {
'root': {
templateUrl: '/Content/app/home/partials/home.html',
},
'content': {
templateUrl: '/Content/app/home/partials/overview.html',
},
}
};
var homeContent = {
name: 'home.content',
parent: 'home',
url: '/:content',
views: {
'root': {
templateUrl: '/Content/app/home/partials/home.html',
},
'content': {
templateUrl: function (stateParams) {
return '/Content/app/home/partials/' + stateParams.content + '.html';
},
}
}
};
$stateProvider
.state(admin)
.state(adminContent)
.state(home)
.state(homeContent);
}

当用户登录时,我知道它是否是 Admin Angular 色用户,因为我有一个安全 token 返回给我,显示:
{
"access_token":"abcdefg",
"token_type":"bearer",
"expires_in":1209599,
"userName":"xx",
"roles":"Admin",
".issued":"Fri, 30 May 2014 12:23:53 GMT",
".expires":"Fri, 13 Jun 2014 12:23:53 GMT"
}

如果 Admin Angular 色用户然后我想
  • 从服务器下载管理模块脚本:/Content/app/admin/admin.js 和/Content/app/admin/homeController.js。我已经为 $http 调用设置了这样的设置:$http.defaults.headers.common.Authorization = 'Bearer ' + user.data.bearerToken;因此在获取脚本时需要发送不记名 token :
  • 添加 admin应用程序的模块

  • 有人可以给我一些关于如何做这两件事的建议。在阅读了有关 require.js 的内容后,我觉得我不想将其用作解决方案。我想要一些尽可能简单的东西。

    根据我的理解,直到 AngularJS 允许它,然后我需要制作它以便我可以注入(inject)我的 Controller 。所以我已经将它添加到 appConfig 中:
    app.controllerProvider = $controllerProvider;

    但是如何下载这两个 javascript 文件以及如何将它们添加到 AngularJS 以便用户可以开始使用管理模块内的 Controller 功能?我看到了一些关于 的东西$script.js 被 Angular 团队使用。这是一个很好的解决方案吗?我该如何实现它来满足我相当简单的需求。

    最佳答案

    您可以将解析属性添加到您的管理路由。

    var admin = {
    name: 'admin',
    url: '/admin',
    resolve: {
    isAdminAuth: function($q, User) {
    var defer = $q.defer();

    if (User.isAdmin) {
    defer.resolve();
    } else {
    defer.reject();
    }

    return defer.promise;
    }
    },
    views: {
    'root': {
    templateUrl: '/Content/app/admin/partials/home.html',
    },
    'content': {
    templateUrl: '/Content/app/admin/partials/overview.html',
    },
    }
    };

    您也可以将其链接起来。
        resolve: {
    adminPermissions: function($q, User) {
    var defer = $q.defer();

    if (User.permissions.isAdmin) {
    defer.resolve(User.permissions.admin);
    } else {
    defer.reject();
    }

    return defer.promise;
    },
    hasAccessToHome: function($q, adminPermissions) {
    var defer = $q.defer();

    if (adminPermissions.hasAccessToHome) {
    defer.resolve(true);
    } else {
    defer.reject();
    }

    return defer.promise;
    },
    },
    resolve 的结果如果解决,属性也将传递给 Controller ​​。如果被拒绝,路由将不会加载。您可以像这样访问它。
    function adminHomeController($scope, adminPermissions, hasAccessToHome) {
    $scope.adminPermissions = adminPermissions;
    }

    您还可以手动引导应用程序:
    <!doctype html>
    <html>
    <body>
    <div ng-controller="WelcomeController">
    {{greeting}}
    </div>

    <script src="angular.js"></script>
    <script>


    var isAdmin = true; <!-- injected variable from server here -->


    var app = angular.module('demo', [])
    .controller('WelcomeController', function($scope) {
    $scope.greeting = 'Welcome!';
    });
    angular.bootstrap(document, ['demo']);
    </script>
    </body>
    </html>

    [引用] - https://docs.angularjs.org/api/ng/function/angular.bootstrap

    您可以使用 jQuery 发出请求,而不是注入(inject)变量或其他一些服务器端模板方法:
    $.getJSON('/my/url', function(data) {
    if (data.isAdmin) {
    // bootstrap app with admin module
    } else {
    // bootstrap app without admin module
    }
    });

    这是一个 IE8+ 兼容的示例替代上述(不是 jQuery):
    request = new XMLHttpRequest();
    request.open('GET', '/my/url', true);

    request.onreadystatechange = function() {
    if (this.readyState === 4){
    if (this.status >= 200 && this.status < 400){
    data = JSON.parse(this.responseText);

    if (data.isAdmin) {
    // bootstrap app with admin module
    } else {
    // bootstrap app without admin module
    }
    }
    }
    };

    request.send();
    request = null;

    [引用] - http://youmightnotneedjquery.com/#json

    关于angularjs - 在我的应用程序启动后,如何在不使用 require.js 的情况下向我的应用程序添加模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23954952/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com