You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular UI-Router v1中DeepStateRedirect如何重置深层状态?

刚好我之前在UI-Router v1(AngularJS版本)里处理过类似的DSR问题,给你两个问题的针对性解决方案:

一、在组件中重置深层状态(DSR)

UI-Router v1已经把原来的$deepStateRedirect服务改名为dsrService,你需要先确保模块依赖了ui.router.dsr插件,之后就能在组件控制器中注入该服务调用重置方法:

  • 第一步:确认主模块引入DSR依赖
angular.module('myApp', ['ui.router', 'ui.router.dsr']);
  • 第二步:在组件控制器中注入dsrService并调用重置方法
angular.module('myApp').component('resetDsrButton', {
  controller: ['dsrService', function(dsrService) {
    this.handleReset = function() {
      // 重置单个指定状态的DSR,传入状态名称即可
      dsrService.reset('app.yourParentState');
      // 如果要重置所有状态的DSR,直接调用不带参数的reset()
      // dsrService.reset();
    };
  }],
  template: '<button ng-click="$ctrl.handleReset()">重置深层重定向状态</button>'
});

这个逻辑和旧版本的$deepStateRedirect.reset({})效果完全一致,只是服务名称和调用方式做了标准化调整。

二、修复shouldRedirect函数的过渡错误

你遇到的"i.state is not a function"错误,核心原因是shouldRedirect函数的参数使用不符合UI-Router v1的规范:在v1中,这个函数接收的是Transition对象,而非旧版本的状态参数,如果你在函数里错误调用了类似state()的旧版方法,就会触发这个报错。

正确的写法是利用Transition对象提供的API完成业务判断,示例如下:

$stateProvider.state('app.parent', {
  deepStateRedirect: {
    default: { state: 'app.parent.defaultChild' },
    // shouldRedirect接收transition对象作为唯一参数
    shouldRedirect: function(transition) {
      // 示例1:获取当前过渡的目标状态信息
      var targetStateName = transition.to().name;
      // 示例2:通过注入器获取业务服务做权限判断
      var authService = transition.injector().get('authService');
      
      // 返回true则执行重定向,返回false则阻止重定向
      return authService.isAuthenticated();
    }
  },
  url: '/parent',
  template: '<div ui-view></div>'
});

注意不要在这个函数里调用state()这类旧版方法,v1中获取状态信息请用transition.to()(目标状态)或transition.from()(来源状态)。

另外提醒:因为你用的是普通脚本引入方式,要确保加载顺序正确:先加载AngularJS,再加载UI-Router核心脚本,最后加载DSR插件脚本(angular-ui-router-dsr.min.js),这样才能正确注册ui.router.dsr模块和dsrService服务。

内容的提问来源于stack exchange,提问作者mrSpear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:44