Javascript 如何在Backbone.js中跟踪路由器更改事件
每次应用程序在Backbone.js中切换URL时,我都需要运行一个函数,并且我需要知道URL更改为的标签。我假设有一个可以绑定到的事件,但我还不能确定绑定到哪个事件和哪个对象Javascript 如何在Backbone.js中跟踪路由器更改事件,javascript,backbone.js,Javascript,Backbone.js,每次应用程序在Backbone.js中切换URL时,我都需要运行一个函数,并且我需要知道URL更改为的标签。我假设有一个可以绑定到的事件,但我还不能确定绑定到哪个事件和哪个对象 具体来说,我想将新URL发送到一个分析应用程序。@qwertymk已经完成了一半。您可以在窗口对象上查找hashchange事件: // jQuery example $(window).bind('hashchange', function(){ console.log(window.location.hash
具体来说,我想将新URL发送到一个分析应用程序。@qwertymk已经完成了一半。您可以在窗口对象上查找hashchange事件:
// jQuery example
$(window).bind('hashchange', function(){
console.log(window.location.hash);
});
我知道这是一篇老文章,但正如@kirk所建议的,Backbone.js已经构建了它
Backbone.history.on("all", function (route, router) {
//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”和“url changed”
以后你可以用
Backbone.history.bind('before:url-change', function(path,e){
console.log("before url change", path, e)
});
还有另一个“Backbone.history.on('route',…)”事件,它也可以工作,您可以在库中发现它被触发):
on('route',function(){debugger;})
它更精确,因为“全部”是一个包罗万象的概念:
从主干文档中引用:
触发一个或多个事件,触发所有绑定回调。回调传递的参数与触发器
的参数相同,但不包括事件名称(除非您正在侦听“all”
,这将导致回调收到事件的真实名称作为第一个参数)
顺便说一下,主干网最佳实践是使用listenTo方法,例如:
myView.listenTo(Backbone.history,'route',function(){debugger;})
这样,您就不需要手动清理事件侦听器,而是将其逻辑绑定到使用它的视图/模型/等。注意,这对旧版本的IE不起作用。(查看Backbone.js源代码-搜索“oldIE”。)您最好使用US G的解决方案。如果url正在更改,而不仅仅是哈希,该怎么办?我比Thomas的解决方案更喜欢这个,但我想知道为什么您有$before主干,为什么您不使用“bind”而不是“on”…我建议使用“route”事件而不是“all”。使用“all”时有双事件触发。也许只有我。谢谢,谢谢,谢谢。终于找到了一个有效的例子!