AngularJs关注服务中变量的变化

时间:2015-12-09 19:58:46

标签: angularjs angularjs-service

我有一个名为service的{​​{1}},它存储了名为loginManager&的对象。 is_logged_in以及其他一些人。我的各种控制器使用api_token使用$ http进行ajax调用。

  

如果api_token在服务器上重置/过期,则响应将以api_token发送,此时我设置auth_error

我想要实现的是,每当is_logged_in = false发生更改时,服务都会使用is_logged_in重定向到/login,即我要观看< / strong>服务中的对象,并在服务本身的更改时调用回调

我只是希望服务能够处理登录和相应的路由,而没有任何控制器担心天气用户是否登录。

3 个答案:

答案 0 :(得分:0)

我建议您将该观察者置于角色应用程序的运行阶段,该应用程序将位于一个位置,您可以通过该应用程序检查服务的值is_logged_in标记。如果用户没有登录,则将他/她直接重定向到登录页面。

<强>代码

app.run(function($rootScope, loginManager, $location){
   $rootScope.$watch(function(){
      return loginManager.is_logged_in;
   }, function(newValue){
       if(angular.isDefine(newValue) && !newValue)
         $location.path('/login');
         //$state.go('login'); //if you are using ui.router 
   })
})

修改

你的问题真的好奇的部分是,你正在改变服务的is_logged_in旗帜,因为@JBNizet问道?如果有任何代码是JavaScript,那么你应该直接从那里重定向到登录页面。

答案 1 :(得分:0)

我相信Pankaj Pakar's答案可行,但你应该使用棱角分明interceptors。他们拦截所有消息。您可以为响应或responseError添加钩子,当您收到auth_error时,您可以执行任何您喜欢的操作。例如$location.path('/login'),向用户显示错误等

如果您想要分离逻辑,您可以使用内部所有代码注入您的服务,并在其上调用一些方法。

答案 2 :(得分:0)

我觉得有必要回答更多问题,Mior是对的,但他的回答需要更多的肉。

在这里,我向您展示了如何处理所有服务器XHR请求,并且响应401未经授权。

首先,您需要一项服务:

'use strict';

angular.module('theModule')
    .factory('interceptorService', ['$q', '$location', function ($q, $location) {
        return {
            response: function (response) {
                return response || $q.when(response);
            },
            responseError: function (rejection) {
                var returnTo = $location.path().replace(/^\/|\/$/g, '');
                if (returnTo === 'login') {
                    return;
                }
                if (rejection.status === 401) {
                    console.log('Unauthorized');
                    $location.path('/login').search('returnTo', returnTo);
                }
                return $q.reject(rejection);
            }
        };
    }]);

这将用于拦截所有XHR调用,并在每次发现401错误时更改位置。

我还添加了一个改进,即&#34; returnTo&#34;参数,您可以在登录后使用它返回上一页。

要将它绑定到您必须调用config方法的每个请求,这是我的主要javascript。

'use strict';

/**
 * @author Gianmarco Laggia
 *
 * Main module of the application an configurations.
 */
angular
    .module('theModule', [])
    .config(['$httpProvider', function ($httpProvider) {
        //Http Interceptor to check auth failures for xhr requests
        $httpProvider.interceptors.push('interceptorService');
    }]);

这几乎是你需要拦截每个请求,处理rejection.status,你也可以拦截事件,如服务器关闭(状态为-1),内部服务器错误(500+),成功状态(在响应部分,状态200+)等。