我正在使用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;
}]
}
});
}]);
感谢您的帮助!
答案 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);
}
关于上述代码:
Loader
是我显示loader-spinner的自定义服务,可能包含overlay
,onElement
和任何其他必需类型。Notification
也是一种自定义服务,用于通知客户有关请求的结果。flags
的{{1}}对象来控制任何错误模板。