如何在Backbone.js中跟踪路由器更改事件

时间:2012-01-12 19:55:05

标签: javascript backbone.js

每次应用程序在Backbone.js中切换URL时我都需要运行一个函数,我需要知道URL已更改为的hashtag。我假设有一个我可以绑定的事件,但我无法弄清楚哪个事件和要绑定的对象。

具体来说,我想将新网址发送到分析应用程序。

4 个答案:

答案 0 :(得分:32)

我知道这是一个老帖子,但就像@kirk建议的那样,Backbone.js已经建立了它。

Backbone.history.on("all", function (route, router) {
    //console.log(window.location.hash);
});

我认为你最好不要使用这种方法。

答案 1 :(得分:5)

@qwertymk就在那里。您可以在窗口对象上查找hashchange事件:

// jQuery example
$(window).bind('hashchange', function(){
    console.log(window.location.hash);
});

答案 2 :(得分:4)

将此放在代码中的顶部

Backbone.History.prototype.navigate = _.wrap(Backbone.History.prototype.navigate, function(){
    // Get arguments as an array
    var args = _.toArray(arguments);
    // firs argument is the original function
    var original = args.shift();
    // Set the before event
    Backbone.history.trigger('before:url-change', args);
    // Call original function
    var res = original.apply(this, args);
    // After event
    Backbone.history.trigger('url-changed');
    // Return original result
    return res;
});

上面的代码将包装History.navigate函数,并在调用时触发“before:url-change”和“url-changed”

稍后您可以使用

Backbone.history.bind('before:url-change', function(path,e){
    console.log("before url change", path, e)
});

答案 3 :(得分:2)

还有另一个“Backbone.history.on('route',...)”事件,它也有效,你可以发现它在库中被触发了:

  

Backbone.history.on('route',function(){debugger;});

更精确,因为'all'是一个全部: 从Backbone文档引用:

  

触发一个或多个事件,触发所有绑定的回调。除了事件名称之外,回调传递与trigger相同的参数(除非你正在监听"all",这将导致你的回调接收事件的真实名称作为第一个参数)

顺便说一句,Backbone最佳实践是使用listenTo方法,例如:

  

myView.listenTo(Backbone.history,'route',function(){debugger;})

这样您就不需要手动清理事件侦听器 - 而是在逻辑上绑定到view / model / etc.使用它。