使用AngularJS Router加载404状态

时间:2016-03-24 14:36:22

标签: javascript angularjs angular-ui-router

我正在使用AngularJSui-router并使用以下代码捕获404并加载到404模板中:

$urlRouterProvider.otherwise(function($injector, $location){
  $injector.invoke(['$state', function($state) {
    $state.go('404');
  }]);
}); 

它保持URL完整而不是重定向,但显示404模板:

.state('404',
{
    views: {
        'body': {
            templateUrl: 'partials/404.html',
        }
    }
});

通常它会重定向到根状态:$urlRouterProvider.otherwise('/');

但是,当HTML5模式关闭且用户访问根网址时,例如http://www.domain.com/app/它会加载404状态,而不是重定向到http://www.domain.com/app/#/

如何保持上面的404状态代码,但在访问初始页面时将其重定向到hashbang?如果请求是主页以外的其他内容,那么只有404加载吗?

我无法使用$stateNotFound$stateChangeSuccess并且需要一种方法来检查它是否是实际配置设置本身内的主页请求,可以在/state.404之间切换在其他声明中{{1}}。

2 个答案:

答案 0 :(得分:3)

这样的事情(似乎确实奏效)。

$urlRouterProvider.otherwise(function($injector, $location){
    $injector.invoke(['$state', function($state) {
        if( $location.$$path == '')
            $state.go('home'); // redirect to /#/
        else
            $state.go('404'); // else go to 404 state
    }]);
});

但是有更好的方法来解决这个问题吗?

答案 1 :(得分:0)

使用httpErrorResponseInterceptor!当httpResponse发生时,这将被触发。这是一个例子

angular
    .module('myApp')
    .factory('httpErrorResponseInterceptor', ['$q', '$state', function ($q, $state) {
     return {
         responseError: function error(response) {
             switch (response.status) {
                 case 404:
                     $state.go('404');
                     break;

                 default:
                     console.log("Unhandled HTTP error:", response);
             }

             return $q.reject(response);
         }
     };
 }
]);