2015-04-02 96 views
2

我的一个路由器处理程序会持续触发两次。虽然我可以清楚地看到路由触发器只被触发一次。我使用的木偶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)的路由,那么同一个方法会触发一次,并使用它两次。

回答

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 
      } 
相关问题