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

How do I track router change events in Backbone.js

本文关键字:路由器 跟踪路由 事件 跟踪 Backbone js      更新时间:2023-09-26

每次应用程序在Backbone.js中切换URL时,我都需要运行一个函数,并且我需要知道URL更改为哪个标签。我假设有一个事件可以绑定,但我还没能弄清楚要绑定到哪个事件和哪个对象。

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

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

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

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

@qwertymk已经走了一半。您可以在窗口对象上查找hashchange事件:

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

将其放在代码的顶部

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"answers"url changed"

稍后您可以使用

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

还有另一个"Backbone.history.on('route',…)"事件,它也起作用,你可以在库中发现它被触发):

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

它更精确,因为"all"是包罗万象的:主干文档报价:

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

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

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

通过这种方式,您不需要手动清理事件侦听器,而是将其逻辑绑定到视图/模型等。使用它。