Angular View自动重定向到默认(否则)视图

时间:2014-12-02 07:14:13

标签: javascript angularjs redirect angular-routing

我的视图会自动重定向到默认(否则)视图,我不知道为什么。点击后,它会从 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();
    }
 });
});

3 个答案:

答案 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()调用中设置一个断点并找出它拒绝你的位置。确保在执行此操作时使用未缩小的文件。