我被这种奇怪的行为困住了。谷歌的点击似乎没有回复任何类似案例的提及,所以我假设我做了一些严重的错误。
我的拦截器确实对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
是什么意思?
感谢。