当前位置: 首页 > 面试题库 >

AngularJS | 在加载之前处理路由

古凌
2023-03-14
问题内容

我希望通过外部服务为我的路由创建简单的身份验证检查。

我在路由对象上定义访问要求:

$routeProvider
    .when('/', {
        templateUrl: 'src/app/views/index.html',
        controller: 'indexCtrl',
        authenticated: true
    })
    .when('/login', {
        templateUrl: 'src/app/views/login.html',
        controller: 'loginCtrl',
        anonymous:  true
    })
    .otherwise({
        redirectTo: '/'
    })
;

然后,我检查我是否有权参加$routeChangeStart活动。

$rootScope.$on('$routeChangeStart', function (event, next) {
    if(next.authenticated && !$myService.isLoggedin())
        $location.path("/login");
    else if(next.anonymous && $myService.isLoggedin())
        $location.path("/secured");
});

实际上,它是可行的-
如果未通过身份验证的用户将其移至登录页面,如果已通过身份验证但该路由仅适用于匿名用户,则将其移至另一个页面,依此类推。

但是-这种重定向实际上是在加载控制器和模板之后发生的! 即使我未经身份验证,它也会导致我的控制器对我的REST API进行一些不必要的请求。

在路线处理之前,我该如何处理?


问题答案:

我的解决方案是结合$locationChangeStart$routeChangeStart

$rootScope.$on('$locationChangeStart', function (event) {
    //If login data not available, make sure we request for it
    if($facebook.isConnected()==null) {
        $facebook.getLoginStatus();
        event.preventDefault();
        return;
    }

    var next=parseRoute().$$route;
    if(!Auth.loginCheck(next))
        event.preventDefault();
});

parseRoute()从复制,angular-route.js解析给定的URL进行路由。

然后,Auth.loginCheck以某种方式构建我的登录检查处理程序(),如果失败,则返回false。

我还使用它$routeChangeStart来处理$route.reload()事件,所以现在在身份验证状态内的每次更改之后,我都要做$route.reload()

$rootScope.$on('$routeChangeStart', function (event, next) {
    Auth.loginCheck(next);
});

最后,我只是使用简单的run()方法来确保始终运行此定制服务。

编辑:

现在,我们使用ngAuth,这是一个旨在解决该确切问题的模块(基于我之前在此处给出的答案)。

最后,我们开发了一个可解决此问题的角度模块。该模块基于我之前在此处发布的答案。

由于这里的要求,我们发布了一个现在可以使用的beta版本:http :
//github.com/GoDisco/ngAuth

随意使用它。



 类似资料:
  • 问题内容: 在我的应用程序中,我必须获取一些JSON数据并将其分配给数组,然后再加载页面。这是我使用CardService服务获取JSON的代码: 在控制器的resolve块中,我具有以下内容: 在实际的控制器中,我有以下内容: 问题是,服务中的fetchCards函数似乎在将JSON数据分配给cards变量之前就解决了诺言。这导致我的视​​图中加载了空白数据,直到刷新两次并很幸运为止。 我可以确

  • 问题内容: 我有一个带有服务的应用程序,该服务包装了我的API调用: 并且我正在使用UI-Router在状态之间进行转换: 我不再使用普通的AngularJS路由器,并且难以理解如何实现404。我可以看到抛出状态被拒绝,但是如何在状态路由器中捕获它呢? 问题答案: 仅当没有其他 路由 匹配时才调用该规则。您真正想要的是拦截事件,即在状态转换中出现问题(例如,解析失败)时触发的事件。您可以在状态更改

  • 问题内容: 是否可以在不保存更改的情况下侦听路由更改和onwindowunload来确认页面离开? 用例: 用户点击返回 用户在浏览器中按下后退按钮 用户类型使用其他URL 如果用户单击“取消”,则停止页面/路线更改。 我看到了几个不同的示例,但没有一个工作得很正确。 问题答案: 演示:http://plnkr.co/edit/Aq8uYg 在演示中,如果您更改输入的值,则在尝试返回时会注意到您。

  • 本文向大家介绍AngularJS中重新加载当前路由页面的方法,包括了AngularJS中重新加载当前路由页面的方法的使用技巧和注意事项,需要的朋友参考一下 这个问题同样困扰我很久,网上的回答五花八门,全都不能解决;终于在网上找很久,看到某大神的解决办法,整理作此分享;使用ui-router重新加载当前页面的问题。(ui-router版本需要是0.2.14以上的) 用angular做项目,会碰到需要

  • 问题内容: 您好朋友,我想在特定的div加载数据之前向Ajax加载器显示,但问题是数据在同一页面上动态传输,但是我的脚本从另一个文件调用数据, 请参见下面的代码 脚本 的HTML 它的工作正常,但我想在同一页面中加载数据,请帮助我 提前致谢 .... 编辑 我想说明之前加载数据装载到 问题答案: 您可以尝试使用以下html- 和脚本-

  • 问题内容: 我在Angular中有一个服务,该服务使用我的API来获取用户信息并将其提供给控制器。设置如下: 在我的控制器中,我将其包含为: 这不会返回任何数据,而如果我将相同的服务功能放在控制器本身中,它将返回正确的值。我在这里想念什么?以前从未在Angular中使用过DI / Services,因此在某个地方可能是一个简单的错误。 我需要确保该服务在控制器加载 之前 返回数据。如何做到这一点