使用Angular的state.go跳转至JSP页面失败问题排查
问题分析与解决方案
你的问题主要出在AngularUI Router的$state.go用法错误,还有几个关键的配置遗漏点,我一步步给你拆解:
1. 最核心的错误:$state.go的参数用错了
$state.go() 接收的是你在路由配置中定义的状态名称,而不是直接的URL路径。你现在写的 $state.go('/bookroom') 是把URL当成了状态名,这肯定跳不动。
举个例子,如果你在路由里定义了这样的状态:
angular.module('nr', ['ui.router']) .config(function($stateProvider, $urlRouterProvider) { // 默认路由(可选) $urlRouterProvider.otherwise('/'); // 定义bookroom状态 $stateProvider .state('bookroom', { // 这个就是状态名! url: '/bookroom', // 对应的URL路径 templateUrl: '/path/to/your/bookroom.jsp' // 要跳转的JSP页面路径 }); });
那正确的跳转写法应该是:
$state.go('bookroom'); // 传状态名,不是URL
2. 模块依赖遗漏:没注入ui.router
你当前的模块定义是 angular.module('nr', []);,但AngularUI Router的$state服务属于ui.router模块,你必须把它注入到你的应用模块里,否则$state服务根本无法正常工作(可以打开浏览器开发者工具看看,大概率会报$state is undefined的错误)。
修改模块定义:
var nr = angular.module('nr', ['ui.router']); // 加入ui.router依赖
3. 额外检查点
除了上面两个核心问题,还有几个地方要确认:
- 页面是否有
ui-view指令:AngularUI Router需要在你的主页面(比如index.jsp)里加上<ui-view></ui-view>标签,用来渲染跳转后的视图内容,不然就算状态切换了,你也看不到JSP页面。 - 确认POST请求确实进入了成功分支:可以在
$state.go前面加个console.log('进入跳转分支了'),看看是否真的执行到了这一步,排除是POST请求没返回200的问题。 - 按钮点击是否正确绑定方法:确保你的触发按钮用了
ng-click="bookEdit.bookEdit()"(因为你把方法放在了$scope.bookEdit对象里),而不是ng-click="bookEdit()",否则方法不会被调用。
修正后的代码片段参考
<script> var nr = angular.module('nr', ['ui.router']); // 注入ui.router依赖 // 配置路由 nr.config(function($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/'); $stateProvider .state('bookroom', { url: '/bookroom', templateUrl: '/bookroom.jsp' // 这里换成你实际的JSP路径 }); }); nr.controller('nController', ['$scope', '$http', '$state', function ($scope, $http, $state) { $scope.bookEdit = { bookEdit: function () { $http({ method: 'POST', url: '/book/edit', data : $scope.nredit }).then(function successCallback(response) { if (response.status == 204) { // 处理204逻辑 } else if (response.status == 200) { $scope.nredit = { }; console.log('准备跳转'); $state.go('bookroom'); // 用状态名跳转 } }, function errorCallback(response) { alert(JSON.stringify(response)); }); } }; }); </script>
内容的提问来源于stack exchange,提问作者net
相关产品推荐
相关产品推荐

