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

Javascript Angularjs:拦截器重定向创建双重渲染,javascript,angularjs,Javascript,Angularjs,我被这种奇怪的行为所困扰。谷歌的搜索结果似乎都没有提到类似的案例,所以我认为我做错了什么 我的拦截器确实会对401状态做出反应,并重定向到适当的路由,但同时它也会呈现上一个路由。因此,我有一个非常丑陋的闪光一个模板,然后其他。我只是尝试测试我的身份验证:如果经过身份验证,则呈现表,否则呈现登录表单。它确实重定向到登录表单,但仍会闪烁表格模板几秒钟 angular.module('Basal', ['ngRoute', 'Basal.users']) .config(function($rout

我被这种奇怪的行为所困扰。谷歌的搜索结果似乎都没有提到类似的案例,所以我认为我做错了什么

我的拦截器确实会对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数据

在服务器端,我只对数据请求设置了会话限制!模板只是一个静态文件。要对模板施加限制,我需要将其拖动到服务器路由中,我相信,这并没有多大的角度。但如果我确实为模板创建了服务器端路由,并对其设置了会话限制,则双重渲染将消失

我不知道这是怎么回事。获取模板和获取数据是异步并行完成的。因此,当JSON请求触发401并重定向到登录模板时,原始表模板仍在运行并呈现为空。因此,我得到了所有丑陋的双重渲染。这是某种比赛。我该怎么阻止它?也许我的拦截器错了?角度拦截器不应该停止任何进一步的处理吗

作为相关问题,
$routeProvider
上的
否则
功能也不起作用。如果我放置一个不存在的URL,我会从服务器获得404,但角度路由无法捕获它。应该是这样吗?如果URL在Angular中发生更改,然后我在浏览器上点击reload,我会得到一个丑陋的404,而不是一个漂亮的重定向。我也应该在拦截器中处理404吗?那么
否则的意义是什么


谢谢。

你看过ng斗篷了吗?它用于防止加载模板时可能出现的内容闪现:否,尚未。我还在学习和探索。。。我马上去看看。谢谢。不,
ng-clope
不能解决问题。在重定向到登录模板之前,我仍然会看到空表模板闪存。快速阅读《ng斗篷》
让我觉得它并不是我所缺少的。我会认为我的拦截机有问题……好吧,ng斗篷很容易!我的问题和我第一次在ng应用程序中进行身份验证时的问题一样。看看这个博客:,它真的帮助我把这些片段组合起来。试着把你的
getJson.fetch
放到路由规则的解决方案中。通过这样做,Angular将首先尝试解决依赖关系,然后渲染视图。如果您尚未通过身份验证,服务器将在尝试获取模板之前发送401错误