如何在ui-router项目的404页面添加跳转至原请求页面的按钮?
在UI-Router 404页面添加跳转按钮至原错误页面
当然可以实现这个需求!核心思路就是在触发404跳转时,先捕获用户原本访问的路径(也就是会返回损坏JSON的那个地址),再把这个路径传递给404页面,最后在页面里添加按钮调用跳转逻辑就行。下面是具体的实现步骤:
1. 捕获并传递原始请求路径
首先修改ui-router的otherwise配置,不要直接跳转到404状态,而是先获取当前的URL路径,再把它作为参数传给404状态:
$urlRouterProvider.otherwise(function($injector) { var $state = $injector.get('$state'); var $location = $injector.get('$location'); // 获取用户原本访问的完整路径(包括查询参数的话用$location.url()) var originalPath = $location.path(); // 跳转到404状态,携带原始路径参数 $state.go('404', { originalPath: originalPath }); });
同时要确保你的404状态配置能接收这个参数:
$stateProvider.state('404', { url: '/404?originalPath', templateUrl: 'views/404.html', controller: '404Controller', params: { // 允许参数为空,避免无原始路径时报错 originalPath: { value: null } } });
2. 在404页面实现跳转按钮
接下来在404的HTML模板里添加按钮,并且只有当存在原始路径时才显示:
<div class="error-page"> <h1>404 - 页面不存在</h1> <p>抱歉,你访问的页面不存在。</p> <button ng-if="vm.originalPath" ng-click="vm.goToOriginal()">查看原始错误内容</button> </div>
然后在404控制器里编写跳转逻辑:
angular.module('yourApp').controller('404Controller', function($stateParams, $location) { var vm = this; // 获取传递过来的原始路径 vm.originalPath = $stateParams.originalPath; vm.goToOriginal = function() { // 跳转到用户原本访问的路径 $location.path(vm.originalPath); // 如果要保留查询参数,就用$location.url(vm.originalUrl),记得之前捕获时用$location.url() }; });
3. 一些注意点
- 如果原始路径是后端接口(返回损坏JSON的那个),要确保ui-router没有匹配这个路径的路由规则,否则跳转后还是会回到404页面。一般来说,前端路由不会匹配API路径,所以这部分不用太担心。
- 如果需要保留完整的URL(包括查询参数和哈希值),可以把捕获的
$location.path()换成$location.url(),跳转时也用$location.url()即可。
这样用户点击按钮就能直接跳转到原本会显示损坏JSON的页面了,完美解决你的需求!
内容的提问来源于stack exchange,提问作者user8317064




