使用Backbone.js静默地将url更改为previous

时间:2011-12-07 13:28:52

标签: javascript url backbone.js pushstate

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

4 个答案:

答案 0 :(得分:14)

您可以通过在导航期间扩展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()方法,它会将你重定向回到最后一个“哈希”。

答案 1 :(得分:1)

我认为mateusmaso的答案大多是正确的,但需要进行一些调整以保证您始终能够获得正在寻找的正确网址。

首先,您需要覆盖route方法以触发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()

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

您可以使用以下命令在弹出窗口或叠加层的onCloseEvent中触发路径:

router.navigate('/lasturl/');

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

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