【问题标题】:Angular View automatically redirecting to default (otherwise) viewAngular View 自动重定向到默认(否则)视图
【发布时间】:2015-01-30 08:48:52
【问题描述】:

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

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();
    }
 });
});

【问题讨论】:

  • 如果您发布 'tab.congratulations' 的内容会很有用,这显然是问题的原因。
  • 我认为问题的原因是HTML,你能分享一下html代码
  • 我很确定,这不是 HTML,因为我也测试了一个空模板,它的行为方式相同。我严重怀疑它是否与路由参数有关。也很抱歉存在差异,我将所有视图名称更改为通用名称,但忘记更改了。我已经编辑了这些差异。
  • 如果您可以发布一个 plunker,那么我们可能会更快地找到错误,我认为这里没有足够的信息。
  • 嗯,问题是我正在使用 Ionic 框架来开发一个混合移动应用程序,我不确定是否能够在 Plunkr 上重现相同的错误。如果您能指导我完成如何调试,我将不胜感激。

标签: javascript angularjs redirect angular-routing


【解决方案1】:

我认为您的 response.details 包含非 url 编码字符,使路由提供商认为您正在导航到更深的页面,即 var response = {details:'bar/foo'}; 实际上会导航到 /view2/bar/foo,从而触发您的其他操作。

【讨论】:

  • 嗯,这是有道理的,但我正在对响应进行字符串化,这不会有帮助吗?它也来自 view1 -> view2 --自动重定向-> view3。它没有跳过 view2,但我会尝试再次转义字符串。
  • 我认为你是对的。我刚刚测试了对字符串的编码,它在一种情况下有效。让我再测试一些案例,我会将您的答案标记为正确。
  • $state.go 构建 url 以传递给 Angular 的路由。所以任何带有“/”或“?”的东西或 '&' 可能会丢弃它。不确定 JSON 字符。理想状态参数是简单的字符串或数字。你想以这种方式传递数据做什么?
  • 假设我正在保存一个对象,成功调用后,API 返回一个对象,我在不同的视图中显示该对象。现在我可以使用$rootScope 将该对象传递给视图,也可以将其作为$stateParam 传递,我选择了后者,因为我会在不同的地方使用这个视图。
  • 您可能应该考虑使用服务。您可以将响应存储在服务中,然后在下一个控制器中请求它。假设您有一个 ItemList 控制器和一个 ItemEdit 控制器,您可以有一个 Item 服务为您存储列表,以防您删除一个项目,然后删除返回新列表,该服务是可注入的,并且是一个单例,因此它将共享状态.
【解决方案2】:

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

【讨论】:

  • 非常感谢我的实现出了什么问题!保持良好的工作! :D
【解决方案3】:

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

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

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

您可以很容易地排除这种情况,只需从 state2 的 URL 中删除参数即可。当然你想要它,但如果删除它可以让你达到状态,那么它就是参数。如果删除它仍然不允许您到达那里,那是另外一回事,您需要在 $state.go() 调用中设置一个断点并追踪它拒绝您的位置。确保在执行此操作时使用未缩小的文件。

【讨论】:

  • 嗨,乍得,只是想澄清一下,它并没有失败,而是自动并立即从第二个视图重定向到第三个视图。我已经通过 angular 提供的各种 stateChange 事件成功地检查了这一点。另外我在 view2 上放了一个 console.log 并且它被记录了,所以它被调用了
  • 与上面的@LokeshSuthar 相同。对数据进行字符串化并不一定使其成为 URL 安全的。 Not-skipping-the-route 并不能告诉你太多 - $stateChangeStart 在状态更改的开始时被触发。这并不意味着没有问题。您仍然应该尝试在 URL 中不带任何参数的 view2。另外,请确保您为 $stateChangeError 注册了一个处理程序,该处理程序将触发有关状态更改问题的详细信息。
  • 乍得我确实注册了那个处理程序,但它什么也没显示,这就是我称之为成功重定向的原因。
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 2012-10-18
  • 1970-01-01
  • 2018-06-30
  • 2015-06-11
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多