6

我偶然发现了 Restangular 用于调用休息服务。它工作得很好,并返回了一个承诺。我需要能够拥有呼叫块。原因是在重新加载新页面时,我在技术上没有登录,但我可能在 cookie 中存储了一个令牌。我想根据休息服务验证这个令牌。问题是我需要它来阻止。

如果发生超时或者它无效,我可以将用户视为未经过身份验证。

这就是想要阻止的原因是我想使用 $location.path 将它们重定向到一个新的 URL,它不是一个有效的令牌。

这不会发生在特定的路线上,所以我不能使用阻塞的解析。从技术上讲,它发生在每条路线上 - 我使用 $on.$routeChangeStart 并检查内部变量是否已登录,如果未登录,我会检查存储的令牌。

这会在每次页面刷新时发生,但不会在应用程序内部导航时发生。

我想要获得的影响是 Gmail 的工作方式。

期待任何人对此的任何见解

谢谢

4

3 回答 3

8

基本上,您需要确保在发生任何路由更改之前发生一些异步操作,在这种情况下,该操作是对用户进行身份验证。

您可以做的是使用$routeChangeStart发出的事件来向resolve路由上的对象添加属性,如下所示:

function authenticate() {
    if ( user.isAuthenticated ) {
        return;
    }
    // Just fake it, but in a real app this might be an ajax call or something
    return $timeout(function() {
        user.isAuthenticated = true;
    }, 3000);
}

$rootScope.$on( "$routeChangeStart", function( e, next ) {
    console.log( "$routeChangeStart" );
    next.resolve = angular.extend( next.resolve || {}, {
        __authenticating__: authenticate
    });
});

由于 Angular 将等待resolve对象中的任何承诺在继续之前实现,因此您可以像示例中那样使用伪依赖项。使用类似的东西,您应该能够保证您的用户在成功执行任何路由之前进行身份验证。

示例:http: //jsfiddle.net/hLddM/

于 2013-08-15T02:24:50.653 回答
0

我认为最好的方法可能是使用 $location.path 来推动用户,您可以使用 .then() 通过将用户留在加载页面上来有效地强制等待。

var currentPath = $location.path();

$location.path(loadingScreen);

//Assuming you have some sort of login function for ease.
Restangular.login(token).then(
    function(result) {
        $location.path(currentPath)
    },
    function(error) {
        $location.path(logInScreen)
    }
);
于 2013-08-07T14:40:18.480 回答
0

如果您使用的是 ui-router,您可以使用相同的 URL 移动到另一个状态,在那里您将使用那个 Restangular.login 和 then ,如果成功返回“登录”状态,否则,进入“登录”状态,用户必须输入他的用户名和密码。

如果你不使用 ui-router,你可以用一些ng-switch.

因此,到达屏幕后,您会执行此操作Restangular.login,默认情况下,您会通过将一些布尔值设置为 true 来显示加载页面。然后,如果它不成功,您将他发送到登录,否则,您将加载设置为 false 并显示页面。

无论如何,我强烈建议使用 ui-router,它会摇滚 :)

希望这有效!

于 2013-08-11T03:58:41.877 回答