为什么我的路由处理程序会触发两次?

时间:2015-04-02 00:37:00

标签: javascript backbone.js marionette

我的一个路由器处理程序一直被触发两次。虽然我可以清楚地看到路由触发器只被触发一次。我正在使用Marionette AppRouter类:

  MainRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            "home": "showHome",
            "view/:num(/:rev)(/:ms)": "viewSmart",   //smart route
            "*route": "showHome" //any other unrecognized routes
        },
        controller: routesController
    });

和带处理程序的控制器:

  routesController = {
        showHome: function () {
            console.info('go home');
        },
       viewSmart: function (num, rev, ms) {
            console.log('view route action triggered');
        },...more routes

在测试此异常时,我发现viewSmart方法中的最后一个可选参数是根本原因。如果我导航到没有(/:ms)的路线,同样的方法会触发一次,然后两次。

1 个答案:

答案 0 :(得分:3)

我将此问题追溯到包含空格字符的参数字符串。由于骨干在封面下使用正则表达式来确定导航到空格字符的路由将其抛出为循环。我猜其他特殊字符也是如此。我不知道为什么路由处理程序会被解雇两次,但如果我只是用加号替换空格字符,那么事情就会恢复正常。我只需要记住用空格替换加号。

导航前:

ms = ms.replace(/ /g, '+');

后:

viewSmart: function (num, rev, ms) {
            console.log('view route action triggered');
            if (ms){
                ms = ms.replace(/\+/g, ' '); // '+' was used to sub for a space 
            }