我的视图会自动重定向到默认(否则)视图,我不知道为什么。点击后,它会从 View1 转到 View2 ,然后自动重定向到默认 View3 。我通过推杆检查 View2
中的console.log()
View1 - > View2 - >的 VIEW3
myApp.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
.state('view1', {
url: "/view1",
templateUrl: "App/Views/start/view1.html",
controller: 'MyController'
})
.state('view2', {
url: "/view2/:details",
templateUrl: "App/Views/start/view2.html",
controller: 'MyController'
});
$urlRouterProvider.otherwise('/view3');
});
我这样称呼$state.go
。
$state.go('view2', { details: JSON.stringify(response.details) });
我尝试通过阻止$stateChangeStart
上的默认来拦截它,但遇到了错误:
$ digest()达到了迭代次数。中止
这是由$urlRouterProvider
和$stateProvider
之间的互动问题引起的here。但即使我成功拦截它,我也不确定这是否正确。那究竟是什么造成的呢?或者我如何找出导致重定向的原因。顺便说一下,我已经检查了$stateChangeError
,但没有。
myApp.controller('MyController', ['$scope', '$stateParams', '$state', function ($scope, $stateParams, $state) {
$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
if (toState.name == "view3" && fromState.name == "view2") {
event.preventDefault();
}
});
});
答案 0 :(得分:4)
我认为你的response.details有非url编码的字符,使路由提供者认为你正在导航到更深的页面,即var response = {details:'bar/foo'};
实际上会导航到/view2/bar/foo
触发你的其他。< / p>
答案 1 :(得分:1)
这是一个黑暗中的镜头,但尝试将$ urlRouterProvider放在$ stateProvider之前。我认为可能发生的事情是$ urlRouterProvider.otherwise()充当了一个观察者的捕获,但是当它在范围内时,所有路径都已经运行。这意味着即使$ stateProvider工作并向正确的URL发送请求,$ urlRouterProvider.otherwise()也会捕获请求,就好像没有发生并将其发送到默认页面一样。
答案 2 :(得分:1)
如果我理解你的问题,你想先知道在哪里调试。我建议为你的response.details添加一个console.log,因为你没有在你的问题中提供。
我不认为这是定义中的操作顺序问题,因为当您调用$ state.go()时,您说这是在点击时发生的。在您这样做的那一刻,路由器将尝试查找并质量您所请求的状态。由于您的州有网址,因此它还会尝试使用您提供的参数将用户发送到该网址。
由于您的失败发生在那时,最合乎逻辑的解释是您的目标路由无法访问,或者路由器认为不是。由于您的路由包含参数,这很可能意味着路由器不接受您的参数 - 此路径设置为需要该参数,因此如果它不存在(或未通过验证),您将触发不然的话()。
只需从state2的URL中删除参数,即可轻松排除这种情况。当然你想要它,但如果删除它允许你到达状态,那么它就是参数。如果删除它仍然不允许你到达那里,那就是其他东西,你需要在$ state.go()调用中设置一个断点并找出它拒绝你的位置。确保在执行此操作时使用未缩小的文件。