渲染404页面而不在角度js中重定向

时间:2015-01-27 13:17:50

标签: angularjs http-status-code-404 angular-ui-router angular-resource

我正在使用ui.router& ngResource与AngularJS,&我的问题是:

如何在不重定向的情况下转发404,例如用户键入http://www.example.com/wrong-page-name,他应该只显示404页面,并且URL不应该更改。

目前我就是这样做的,但重定向

    angular.module('app')
   .run(['$rootScope', '$state', function($rootScope, $state) {

            $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {
                if(error.status === 404) {
                    $state.go('innerPages.page', {slug:"not-found"});
                }
            });
    })
    .config(['$stateProvider','$urlRouterProvider', function($stateProvider, $urlRouterProvider) {

            $stateProvider.state('innerPages.page', {
                url: ':slug',
                views : {
                    'content@':{
                        templateUrl : '...',
                        controller : 'pageController'
                    },
                    'pageHeader@' : {
                        templateUrl : "...",
                        controller : 'pageController'
                    }
                },
                resolve:{
                    page: ['pageService', '$stateParams', function (pageService, $stateParams) {
                        return pageService.get({slug:$stateParams.slug}).$promise;
                    }]
                }
            });

        }]);

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

为什么不显示404模板?

<any ng-view ng-class="{'hidden': notFound}"></any>
<div class="not-found-template hidden" ng-class="{'hidden': !notFound}">
  <h2>Not Found!</h2>
</div>

对于css:

.hidden
{
  display: none !important;
}

添加错误处理服务(可选)

 angular.module('app').service('Errors', function ($rootScope) {
  this.handle = function (error, status) {
    // not found
    switch (status) {
      case 404:
        alert('Sorry! the page was not found.');
        // This is the required line for showing 404 template
        $rootScope.notFound = true;
        break;
      case 500:
        alert('Sorry! Error connecting to server.');
        break;
      case 403:
        $location.path('/login');
        break;
      default:
        alert('Sorry! Error connecting to server.');
    }
  }
});

答案 1 :(得分:0)

我想添加一个推荐且更有条理的答案:

使用$httpInterceptor工厂记录的here(参见Interceptors段落):

  

出于全局错误处理,身份验证或任何类型的目的   请求或的同步或异步预处理   回复的后处理

通过您的应用程序在所有HTTP请求中

更改responseError方法,如:

'responseError': function (error) {


  //hide any showing loader spinners
  loader.hide();


  // handle errors by type
  var status = error.status;
  switch (status) {


    // here you can show 404 templates and go more further
    case 404:
      $rootScope.flags.errorCode = 404;
      break;


    // here I check if error has messages or it's an internal server error
    case 500:
      try {
        if (!error.data.success && typeof error.data.data.message != 'undefined') {
          Notification.error(error.data.message);
        } else {
          $rootScope.flags.errorCode = 500;
        }
      } catch (e) {
        $rootScope.flags.errorCode = 500;
      }
      break;


    // authenticating for actions that un-authenticated uses can not do, like staring or commenting
    case 401:
      Popup.show('login');
      break;


    // showing notification for any other error types
    default:
      Notification.error('Sorry! Error connecting to server.');
  }
  return $q.reject(error);
}

关于上述代码:

  1. Loader是我显示loader-spinner的自定义服务,可能包含overlayonElement和任何其他必需类型。
  2. Notification也是一种自定义服务,用于通知客户有关请求的结果。
  3. 可以使用固定到flags的{​​{1}}对象来控制任何错误模板。