javascript - 有没有办法阻止我的 angularjs 应用程序启动时加载初始状态?

标签 javascript django angularjs angular-ui-router

背景

在加载第一个状态之前,我的应用需要向服务器发出请求以验证用户是否有经过身份验证的 session 。根据 url,用户可能需要被重定向到登录页面。

即如果初始 url 是 myapp.com/#/profile 并且用户没有预先存在的经过身份验证的 session ,他们将被重定向到 myapp.com/#/登录


问题

我有适当的逻辑来处理这种情况,但是在向服务器发出 session 数据请求之后并在它完成之前,会立即触发初始状态更改,并在服务器响应之前加载和显示页面


可能的解决方案

1) 我使用 django 作为我的后端,所以可以只从应用程序中删除初始服务器请求并将数据直接传递给 django 模板中的应用程序。要么通过

  • 主 Controller 的 ng-init - 虽然我读到这是一个 坏主意,因为它不是预期用途

  • 或者在 django 模板的脚本标签中——我讨厌这样做 这样做,因为我宁愿将我所有的应用程序逻辑单独放在 js 文件中

2) 监听初始的 $stateChangeStart,取消它然后在服务器请求完成后调用 $state.reload()


问题

在我看来,在初始状态更改发生之前满足某些条件似乎是一个相当普遍的要求,所以我想知道我是否遗漏了文档中的某些内容并且已经有一种内置的方法来处理这种情况?

或者有没有办法停用 $urlRouterProvider/$stateProvider 以防止发生初始状态更改?

最佳答案

假设您所有的身份验证逻辑都已经在 AuthService 之类的东西中,是否可以执行以下操作?

// 'AuthService' injected earlier
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
    if (!AuthService.isAuthenticated()) {
        // prevent navigation. don't go anywhere;
        // navigation will occur inside AuthService
        event.preventDefault();

        AuthService.setNextState(toState.name);
        AuthService.authenticateWithServer();
    }
    // proceed normally if user is already authenticated
});

然后,您的AuthService:

app.service('AuthService', function($rootScope, $http, $state) {
    var next;

    this.setNextState = function(nextState) { next = nextState; };

    this.isAuthenticated = function() { ... };

    this.authenticateWithServer = function() {
        $http.post('/authen', { ... }).success(function(user){
            // house-keeping
            $rootScope.user = user;

            // navigate by state name
            $state.go(next);
        }).error(function(error) {
            // navigate to login screen
            $state.go('login');
        });
    };
});

这样一来,您的状态定义就很干净,并且身份验证逻辑被隔离在一个地方。您还可以确定,在您拥有所需的所有信息之前,导航永远不会发生。

关于javascript - 有没有办法阻止我的 angularjs 应用程序启动时加载初始状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556964/

相关文章:

javascript - Promise、$mdDialog 和操作顺序

angularjs - Grails-无法将数据库状态与 session 同步

javascript - JS Fullcalendar 在月 View 中重复事件

javascript - java backing bean加载图片后自动调用JS函数

javascript - 如何选择一个按钮并在单击该按钮时删除该按钮的祖 parent div?

python - 对象没有属性 '__getitem__'

angularjs - Ionic 应用程序 我已经遇到这个问题很长一段时间了,这是权限问题吗?

javascript - Window.postMessage() 问题

python - 比较两个 django 的 DateTimeField 信号

python - 如何修复: Django error: no such table: main.classroom_student__old