You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动