角度视图自动重定向到默认(否则)视图

Angular View automatically redirecting to default (otherwise) view

本文关键字:视图 默认 否则 重定向      更新时间:2023-09-26

我的视图会自动重定向到默认(否则(视图,我不知道为什么。当我单击时,它从视图 1 转到视图 2,然后自动重定向到默认视图 3。我通过放 视图中的console.log() 2

视图 1 -> 视图 2 -> 视图 3

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之间的交互问题,如此处所述。但即使我成功拦截了它,我也不确定这是否是正确的方法。那么究竟是什么原因造成的呢?或者我如何找出导致重定向的原因。顺便说一句,我已经检查了$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();
    }
 });
});

我认为您的响应.details具有非url编码字符,使路由提供商认为您正在导航到更深的页面,即 var response = {details:'bar/foo'};实际上是导航到/view2/bar/foo触发您的其他方式。

这是在黑暗中拍摄的,但请尝试将$urlRouterProvider放在$stateProvider之前。 我认为可能发生的情况是 $urlRouterProvider.else(( 充当观察者的所有捕获,但当它在范围内时,所有路由都已经运行完毕。 这意味着即使$stateProvider工作并向正确的 URL 发送请求,$urlRouterProvider.else(( 也会捕获请求,就好像这没有发生一样,并将其发送到默认页面。

如果我理解你的问题,你想知道先在哪里调试。我建议添加一个控制台.log为您的 response.details,因为您没有在您的问题中提供它。

我不认为这是您的定义中的操作顺序问题,因为当您调用 $state.go(( 时,您说这是在单击时发生的。在您执行此操作的那一刻,路由器将尝试查找并处理您请求的状态。由于您的州具有 URL,因此它还会尝试使用您提供的参数将用户发送到该 URL。

由于您的故障发生在此时,因此最合乎逻辑的解释是您的目标路由无法访问,或者路由器认为无法访问。由于您的路由包含参数,这很可能意味着路由器不接受您的参数 - 此路径设置为需要该参数,因此如果它不存在(或未通过验证(,您将触发 .else((。

您可以通过简单地从 state2 的 URL 中删除参数来轻松排除这种情况。当然你想要它,但如果删除它可以让您达到状态,那么它就是参数。如果删除它仍然不允许你到达那里,它是另一回事,你需要在 $state.go(( 调用中设置一个断点,并找出它拒绝你的地方。确保在执行此操作时使用未缩小的文件。