【问题标题】:Backbone - history.back() reloads page if .navigate({replace: true}) is usedBackbone - 如果使用 .navigate({replace: true}),history.back() 会重新加载页面
【发布时间】:2014-05-26 09:04:53
【问题描述】:

我在 Backbone 导航中遇到了这个奇怪的问题。我阅读了很多帖子,但找不到与我的问题相关的任何内容。

所以情况如下:假设我们有页面:A、B 和 C。
B 是编辑页面,我不想将其包含在历史记录中。

如果用户在页面 A 上,转到 B,然后到 C。如果他单击后退按钮,他应该被重定向到 A。

所以,为了让它工作,我监听元素上的所有点击事件,拦截它们,然后调用 Backbone.history.navigate() 方法。我还检查了当前的url,如果是B,我将{replace:true}参数传递给navigation(),这样B就从历史记录中省略了。

基本上它有效,B 从历史中省略。只有当 B 被跳过时,页面才会重新加载,而不仅仅是改变视图。如果没有跳过任何路线,则无需重新加载即可工作。

所以,例如:

  • 如果我从 A 转到 B,单击“返回”,浏览器返回 A,无需重新加载,它会用幻灯片动画替换视图
  • 如果我从 A 到 B,然后到 C,单击“返回”,浏览器会转到 A,但会重新加载页面。所以我没有看到幻灯片动画,而是完全重新加载并带有闪烁的空白页。

我没有使用 pushState。目前在 Chrome 上测试。

欢迎任何建议。我坚持了几个小时。无论我尝试什么都会导致相同的行为。我尝试启用 pushState,没有变化。

【问题讨论】:

  • 我知道很难用代码重现类似的东西,但是为此做一个简单的小提琴是不是太过分了?我会说问题可能出在遇到页面 A 的路由器时启动的功能。也许您检查视图是否对应于页面 B,然后制作滑动动画,如果页面是 C,您不处理其他情况?
  • 没那么简单。动画是用 jQuery Mobile 完成的,用 Backbone 路由......我必须为小提琴制作一个完整的迷你应用程序。我希望有人在此之前偶然发现并知道问题所在。如果没有人有答案,我稍后会做一个小提琴。没有任何特定于视图的检查。视图是从路由方法创建的,它们都使用相同的方法来替换视图。唯一的“特殊”逻辑是从 B 移动到 C 时,传递了 replace:true 参数。如果所有路线都相同,则其他所有内容
  • @ZolaKt 我看到在我正在构建的 Backbone 应用程序中发生了同样的事情。我会为你整理一个小例子。
  • 我试图将指向示例的链接放入原始问题中,但看起来这不起作用。无论如何,这是一个例子:jsfiddle.net/niaconis/AV6V6/3@AhmadAlfy 这对诊断有帮助吗?

标签: javascript jquery backbone.js navigation browser-history


【解决方案1】:

我也看到了这个,在 chrome 35.0.1916.114 m 中,但没有足够的评论点:) @codefox421,我可以通过修改在你的小提琴中重新创建效果 像这样的 routeViewB 处理程序:

   routeViewB: function routeViewB() {
        this.navigate("xxx",{trigger:false,replace:true} );
        $('body>*').detach();
        $('body').append( app.viewB.$el );
    },

现在访问B后,点击返回会重新加载页面:(

我还在这里发现了一个非常相似的问题的报告: https://github.com/BlueSpire/Durandal/issues/513

希望有一个解决方法/修复。 atm 我被难住了。

** 我刚刚更新到最新的 chrome,问题已解决。

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 2012-07-28
    • 2017-04-22
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多