Backbone.js历史'路线改变'事件?

时间:2012-03-01 17:06:27

标签: backbone.js

每次导航到其他网址时是否会触发一般事件?

window.App =
  Models: {}
  Collections: {}
  Views: {}
  Routers: {}

  init: ->
    # Initialize Routers
    new App.Routers.Main()

    # Initialize History
    Backbone.history.start(pushState: true)

    # BIND VIEW CHANGE?
    $(@).on 'changeOfRoute', -> 
      console.log "Different Page" 

$(document).ready ->
  App.init()

可以按视图执行此操作,但我正在寻找一般解决方案。

4 个答案:

答案 0 :(得分:47)

路由器上有“route”事件:

  

http://backbonejs.org/#Events-catalog

     
      
  • “route”(路由器,路由,参数) - 在匹配任何路由时由历史记录(或路由器)触发。
  •   

这允许您绑定到特定路由。

如果要在任何路径之后触发处理程序,请绑定到“route”,路由将是第一个参数:

myRouter.on("route", function(route, params) {
    console.log("Different Page: " + route);
});

这只会触发明确定义的路线的事件。如果要为未明确定义的路径触发事件,请按How to detect invalid route and trigger function in Backbone.Controller

添加“splat”路径

答案 1 :(得分:2)

来自the Backbone docs

只要路由匹配并且即将执行相应的回调,就会在路由器内部调用此方法。覆盖它以执行自定义解析或包装路由,例如,在将查询字符串交给路由回调之前解析查询字符串,如下所示:

var Router = Backbone.Router.extend({
  execute: function(callback, args) {
    args.push(parseQueryString(args.pop()));
    if (callback) callback.apply(this, args);
  }
});

This site提供了一些有用的代码,用于重新定义路由器以支持'之前'和'之后'钩子,虽然它需要更新Backbone的每个版本更改。

答案 2 :(得分:0)

@TTT:不幸的是Backbone没有给我们一个前/后事件,所以你需要覆盖或扩展Router.route。您可以在此答案中找到执行此操作的方法:https://stackoverflow.com/a/16298966/2330244

答案 3 :(得分:0)