Angularjs:拦截器重定向创建双重渲染

时间:2014-04-28 12:45:39

标签: javascript angularjs

我被这种奇怪的行为困住了。谷歌的点击似乎没有回复任何类似案例的提及,所以我假设我做了一些严重的错误。

我的拦截器确实对401状态作出反应并重定向到适当的路线,但同时它也渲染了以前的路线。所以我有一个非常难看的闪存,一个模板然后另一个。我只是试图测试我的身份验证:如果经过身份验证,则呈现表,否则呈现登录表单。它确实重定向到登录表单,但仍然闪烁表模板几分之一秒。

angular.module('Basal', ['ngRoute', 'Basal.users'])

.config(function($routeProvider, $locationProvider, $httpProvider) {
  $locationProvider.html5Mode(true);
  $httpProvider.interceptors.push('authInterceptor');
  $routeProvider.
    when('/', {
      templateUrl: '/tpl/table.html',
      controller: 'MainCtrl'
    }).
    when('/login', {
      templateUrl: '/tpl/login-form.html',
      controller: 'MainCtrl'
    }).
    otherwise({
      redirectTo: '/'
    });
});


angular.module('Basal.users', [])
.controller('MainCtrl', function($scope, getJson) {

  getJson.fetch(function (d){
    $scope.computers = d;
    });
})

.factory('getJson', function($http, $location) {
  return {
    fetch: function (c) {
      $http.get("/json")
        .success(function(data) {
          console.log("getJson: Success!");
          c(data);
        })
        .error(function() {
          console.log("getJson: Failure!");
        });
    }
  }
})

.factory('authInterceptor', function($q, $location) {
  return {
    'responseError': function(response) {
      if (response.status === 401) {
        $location.path('/login');
      }
      return $q.reject(response);
    }
  }
});

现在,当我点击' /'在浏览器上,Angular在后台执行两个请求:一个是获取表模板并将其插入到视图中,另一个是获取JSON数据。

在服务器端,我只对数据请求设置了会话限制!模板只是一个静态文件。为了对模板施加限制,我需要将其拖动到服务器路由中,我相信,这不是Angular如何做的事情。但是如果我为模板创建服务器端路由并对其设置会话限制,那么双重渲染就会消失。

我对这是如何工作感到困惑。获取模板并获取数据是并行异步完成的。因此,当JSON请求触发401并重定向到登录模板时,原始表模板仍然会通过并呈现为空。因此,我得到了所有丑陋的双重渲染。这是某种种族。我怎么阻止它?也许我的拦截器是错的?是不是Angular拦截器应该停止任何进一步处理?

作为相关问题,otherwise上的$routeProvider功能也不起作用。如果我放一个不存在的URL,我从服务器获得404,但Angular路由没有捕获它。这是怎么回事?如果在Angular中发生URL更改,然后我在浏览器上点击重新加载,我会得到一个丑陋的404而不是一个很好的重定向。我是否应该在拦截器中处理404?那么otherwise是什么意思?

感谢。

0 个答案:

没有答案