【问题标题】:Why does my route handler fires twice?为什么我的路由处理程序会触发两次?
【发布时间】:2015-04-02 00:37:00
【问题描述】:

我的一个路由器处理程序持续触发两次。虽然我可以清楚地看到路由触发器只触发了一次。我正在使用这样的 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) 的路线,则相同的方法会触发一次,然后触发两次。

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

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

    导航前:

    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 
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多