2012-03-14 62 views
7

想知道是否有一种简单的方法来在每次使用Backbone.js路由器时触发自定义函数,而不必将其添加到每个路由器函数中。现在,我的剧本是这样的:Backbone.js每次使用路由器时触发函数

var AppRouter = Backbone.Router.extend({ 

    routes: { 
     '' : 'index', 
     'test': 'test', 
    }, 

    initialize: function() { 
    }, 

    index: function() { 
     customFunction(); 
     indexView.render(); 
    }, 

    test: function() { 
     customFunction(); 
     testView.render(); 
    }, 

}); 

我想有它这样的事情:

var AppRouter = Backbone.Router.extend({ 

    routes: { 
     '' : 'index', 
     'test': 'test', 
    }, 

    initialize: function() { 
    }, 

    index: function() { 
     indexView.render(); 
    }, 

    test: function() { 
     testView.render(); 
    }, 

    change: function() { 
     customFunction(); 
    } 

}); 

有没有人有什么建议?

回答

19

每当路线与Router相匹配时,就会触发一个route:[name]事件,该路线的名称与匹配的路线的名称相同,以允许班级侦听某些路线匹配。所有主干对象还支持all事件,该事件在事件发生时触发。

所以你可以利用这个来绑定Router上的all事件,每当路由器做一些路由时它就会触发。

initialize: function() { 
    this.bind("all", this.change) 
}, 

如果您对匹配的路由感兴趣,它将作为第一个参数传递给绑定函数。

更多细节here in the FAQ

+0

谢谢,工作就像一个魅力!虽然,我不得不使用this.bind()而不是仅仅绑定() – hampusohlsson 2012-03-14 14:54:22

+0

糟糕,我会更新我的答案。 – obmarg 2012-03-14 14:55:00

+0

如果您的'。trigger:true}'作为您的'.navigate'调用的一部分,那么事件是在路由“运行”之前还是之后发生的? – tkone 2012-03-21 14:23:17

9

更(新)骨干编写绑定的方法是:

initialize: function() { 
    this.listenTo(this, "all", this.change) 
}, 

一个更好听,如果你问我会只是route;由于all触发两个事件,我想这些:

“路线:名字]”(PARAMS) - 射击路由器当一个特定的路线是 匹配。
“路线”(路线,参数) - 当任何路线 已被匹配时由路由器启动。

+2

这是2015年的更好的答案 – 2015-07-13 23:57:03

+2

它是在2014年制成的:) – 2015-07-14 13:48:08

0

我是新来的骨干。继Laurens回答后,我设法呼吁每条路线变更如下

app_router.on('route', function(e){ 
    console.log(e); 
});