Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Backbone.js中跟踪路由器更改事件_Javascript_Backbone.js - Fatal编程技术网

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

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

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


具体来说,我想将新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”时有双事件触发。也许只有我。谢谢,谢谢,谢谢。终于找到了一个有效的例子!