【问题标题】:Silently change url to previous using Backbone.js使用 Backbone.js 将 url 静默更改为以前的
【发布时间】:2011-12-07 13:28:51
【问题描述】:

使用 Backbone.js,是否可以让路由器导航到它来自的页面?我想将它用于在出现弹出窗口时更改我的 URL 并且我想在隐藏弹出窗口时将其更改回来的情况。我不想简单地返回,因为我想在显示弹出窗口之前将背景页面保持在与离开它的位置完全相同的位置

【问题讨论】:

    标签: javascript url backbone.js pushstate


    【解决方案1】:

    您可以通过扩展Backbone.Router 并在导航期间存储所有路线来解决此问题。

    class MyRouter extends Backbone.Router
      constructor: (options) ->
        @on "all", @storeRoute
        @history = []
        super options
    
      storeRoute: ->
        @history.push Backbone.history.fragment
    
      previous: ->
        if @history.length > 1
          @navigate @history[@history.length-2], true 
    

    然后,当您必须关闭您的模式时,只需调用 MyRouter.previous() 方法,它会将您重定向回最后一个“哈希”。

    【讨论】:

    • 实际上你可以简单地只存储最后一个“哈希”而不是孔历史
    • 谢谢!正是我想要的。
    • 我不相信这会保证 storeRoute 方法总是在可能使用它的路由方法之前被调用。因此,历史记录中存储的内容将不一致。
    • 这可能是一个愚蠢的问题,但是我以前从未见过这种语法用于 JS,它是运行某些东西还是先编译?
    • 嘿@jamie-wilson,我正在用coffeescript 编码.. 看看,有有用的功能和糖语法,它编译成优化的javascript 然后coffeescript.org
    【解决方案2】:

    我认为 mateusmaso 的回答大部分是正确的,但需要进行一些调整以确保您始终获得所需的正确 URL。

    首先你需要重写路由方法来触发 beforeRoute 方法:

    route: (route, name, callback) =>
       Backbone.Router.prototype.route.call(this, route, name, =>
         @trigger('beforeRoute')
         callback.apply(this, arguments)
       )
    

    然后你绑定事件并初始化历史实例变量:

    initialize: (options) ->       
       @history = []
       @on "beforeRoute", @storeRoute
    

    接下来创建用于存储和检索片段的辅助方法:

    storeRoute: =>
       @history.push Backbone.history.fragment
    
    previousFragment: =>
       @history[@history.length-2]
    

    最后,您需要一个最终的辅助方法,该方法可用于更改 URL 而无需重新加载和存储生成的片段。您需要在关闭弹出窗口时使用它,否则如果用户在没有导航到其他任何地方的情况下再次获得弹出窗口,您的历史记录中将不会有预期的片段。这是因为在没有“trigger: true”的情况下调用导航不会触发事件处理程序来存储片段。

    changeAndStoreFragment: (fragment) =>
       @navigate(fragment)
       @storeRoute()
    

    【讨论】:

      【解决方案3】:

      这个答案可能无法解决这个问题,但它几乎是同一个问题。由于尾部斜杠,我无法静默导航到以前的路线或自定义路线。为了不触发路由功能,请使用{trigger:false},或者根本不使用触发器,因为false是默认行为,并确保您的路由以#something开头而不是'#/something'(注意斜线),或更改 Backbone.js 中的正则表达式,即路由器部分。

      【讨论】:

        【解决方案4】:

        您可以在弹出窗口或叠加层的 onCloseEvent 中触发路由:

        router.navigate('/lasturl/');
        

        这将设置网址。如果您将 true 作为第二个参数传递,您还将执行 routes 操作。否则页面将保持不变。

        http://documentcloud.github.com/backbone/#Router-navigate

        【讨论】:

        • 当然可以,但问题是,我怎么知道最后一个 url 是哪个? Backbone 是否提供了有用的方法,或者我必须从 window.history 中获取它?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多