2012-02-29 45 views
0

我使用Backbone的「全部」事件來捕獲我應用中的所有路由事件,以便記錄頁面視圖。只要我不使用navigate來手動觸發路線,這很好。 在以下示例中,我將用戶從dashboard路由轉發到login路由。骨幹觸發事件執行路線後回調,導致下面的輸出:使用導航時由Backbone.Router觸發的事件順序

showDashboard 
showLogin 
route:showLogin 
tracking:/login 
route:showDashboard 
tracking:/login 

顯然,這不是我想要的。我知道我可以撥打showLogin而不是使用navigate來觸發登錄路由,這就是我現在正在做的事情,但我想知道爲什麼事件的順序與觸發的回調的順序不同。

這裏是我的路由器(縮短):

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     "/login": "showLogin", 
     "": "showDashboard", 
    }, 
    initialize: function() { 
     return this.on('all', this.trackPageview); 
    }, 
    trackPageview: function(eventName) { 
     console.log(eventName); 
     var url = Backbone.history.getFragment(); 
     console.log('tracking: ' + url); 
    }, 
    showDashboard: function() { 
     console.log('showDashboard'); 
     // check if the user is logged in etc. 
     this.navigate('#/login', { trigger: true }); 
    }, 
    showLogin: function() { 
     console.log('showLogin'); 
    } 
}); 

回答

1

骨幹Router其實很簡單,如果你讀the code,你會看到它的構造函數如下:

this._bindRoutes(); 
this.initialize.apply(this, arguments); 

_bindRoutes華武官你所期望的所有路線,之前你的initialize函數被調用。所以你的綁定總是會在Backbone's之後觸發。

你可能會更好地找到另一種方式來做到這一點。

你可以在路由中自己調用一個before類型的函數來完成跟蹤瀏覽量/等等。或者,也許你可以覆蓋route,跟蹤你的綜合瀏覽量,然後確保使用類似Backbone.Router.prototype.route.call(arguments);

相關問題