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

Why does my route handler fires twice?

本文关键字:两次 我的路 处理 程序 为什么      更新时间:2023-09-26

我的一个路由器处理程序始终被触发两次。虽然我可以清楚地看到路线触发器只触发过一次。我使用的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)的路线,相同的方法会激发一次,同时激发两次。

我将此问题追溯到一个包含空格字符的参数字符串。由于主干使用隐藏的regex来确定导航到空格的路由,因此字符会将其抛出循环。我猜其他特别的角色也会。我不知道为什么路由处理程序会被解雇两次,但如果我只是用加号替换空格字符,例如,事情就会恢复正常。我只需要记住把加号换成空格。

导航前:

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 
            }