我正在使用Backbone"所有"事件以捕获我的应用程序中的所有路径事件,以记录页面视图。只要我不使用navigate
手动触发路线,这种方法就可以正常运行。
在以下示例中,我将用户从dashboard
路由转发到login
路由。 Backbone在执行路由回调后触发事件,导致以下输出:
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');
}
});
答案 0 :(得分:1)
Backbone的Router
实际上非常简单,如果您阅读the code,您会在其构造函数中看到以下内容:
this._bindRoutes();
this.initialize.apply(this, arguments);
_bindRoutes
会按预期附加所有路由,并且在调用initialize
函数之前执行此操作。所以你的绑定总是会在Backbone之后发生。
你可能会更好地找到另一种方法来做到这一点。
您可以在路线中自行调用before
类型的功能来执行跟踪网页浏览等操作。或者也许您可以覆盖route
,跟踪您的网页浏览,然后确保使用Backbone.Router.prototype.route.call(arguments);