使用 Backbone.js,是否可以让路由器导航到它来自的页面?我想将它用于在出现弹出窗口时更改我的 URL,并且我想在隐藏弹出窗口时将其更改回来的情况。我不想简单地返回,因为我想在显示弹出窗口之前将背景页面保持在与离开它的位置完全相同的位置
4 回答
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()
它会将您重定向回最后一个“哈希”的方法。
我认为 mateusmaso 的回答大部分是正确的,但需要进行一些调整才能保证您始终获得所需的正确 URL。
首先,您需要重写 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()
这个答案可能无法解决这个问题,但它几乎是同一个问题。由于尾部斜杠,我无法静默导航到以前的路线或自定义路线。为了不触发路由功能,请使用{trigger:false}
或根本不使用触发器,因为false
这是默认行为,并确保您的路由以#something
“#/something”而不是“#/something”开头(注意斜杠),或更改正则表达式在 Backbone.js 中,路由器部分。
您可以在弹出窗口或叠加层的 onCloseEvent 中触发路由:
router.navigate('/lasturl/');
这将设置网址。如果您将 true 作为第二个参数传递,您还将执行 routes 操作。否则页面将保持不变。