使用导航时Backbone.Router触发的事件顺序

时间:2012-02-29 11:06:15

标签: javascript backbone.js

我正在使用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');
    }
});

1 个答案:

答案 0 :(得分:1)

Backbone的Router实际上非常简单,如果您阅读the code,您会在其构造函数中看到以下内容:

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

_bindRoutes会按预期附加所有路由,并且在调用initialize函数之前执行此操作。所以你的绑定总是会在Backbone之后发生。

你可能会更好地找到另一种方法来做到这一点。

您可以在路线中自行调用before类型的功能来执行跟踪网页浏览等操作。或者也许您可以覆盖route,跟踪您的网页浏览,然后确保使用Backbone.Router.prototype.route.call(arguments);

之类的内容调用Backbone的实现