2015-04-02 132 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 
      } 
相關問題