2012-03-14 21 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); 
});