2012-06-25 34 views
1

不知道如何強制骨幹正確地瀏覽到這樣的路線:中骨幹路由器導航到... /#/ <route>而不觸發路由器事件。如何?

頁/#/渠道/名稱

代替

頁#槽鋼/名稱

頁#/渠道/名稱

我的路由器的工作原理與一個主模型,觀察其狀態,所以路由器應該能夠改變URL,而不會觸發其事件在這種情況下。

我試着這樣做:

router.navigate("#/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false }); 

但在這種情況下,「觸發:假」沒有工作,所以我得到的路由器事件的不受歡迎的呼叫。

Backbone.history root設置爲「/」,我目前沒有使用pushState。

見下面的代碼示例:

var Router = Backbone.Router.extend({ 
    routes: { 
     "": "index",    
     "index": "index", 
     "channel/:channelName": "changeChannel" 
    }, 

    initialize: function (options) { 
     var router = this; 

     if (options.model) { 
      router.model = options.model; 
     } else { 
      //TODO: throw error 
      return; 
     } 

     //update url in cases of model channelSelection changes 
     router.model.on("stateChangeAccepted", function (appState) { 
      switch (appState.mode) { 
       case "channel": 
        router.navigate("/channel/" 
         + encodeURIComponent(appState.data.channelName), { trigger: false }); 
        break;      
      } 
     }); 
    }, 

    index: function() { 
     var router = this; 

     router.model.trigger("stateChangeRequest", { 
      mode: "channel", 
      data: { 
       channelIndex: 0 
      } 
     }); 

    }, 

    changeChannel: function (channelName) { 
     var router = this; 

     router.model.trigger("stateChangeRequest", { 
      mode: "channel", 
      data: { 
       channelName: decodeURIComponent(channelName) 
      } 
     }); 

    } 
}); 
+0

避免使用引導斜槓,所以不要使用/ page#/ channel /而是使用/ page#通道。它在Backbone文檔中記載,最好這樣做。這可能會解決你的問題 –

+0

它工作正常,沒有斜槓,我知道。我只想獲得頁面/#/頻道網址,類似於Twitter –

回答

0

router.navigate通話不符合您定義的路線:

routes: { 
    "": "index",    
    "index": "index", 
    "channel/:channelName": "changeChannel" 
}, 

這意味着,對於一個頻道的網址應該是http://host.com/#channel/someChannel。但是,您的router.navigate調用要麼是router.navigate('#/channel...)要麼是router.navigate('/channel...)。它應該是:

router.navigate("channel/" + encodeURIComponent(appState.data.channelName), { trigger: false }); 

但是,如果你想使用的路線一樣http://host.com/#/channel/someChannel,那麼你的路徑應該是:

routes: { 
    "": "index",    
    "index": "index", 
    "/channel/:channelName": "changeChannel" 
}, 

,你的導航調用應該是:

router.navigate("/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false }); 
+0

在這種情況下,我獲得的網址類似於網頁/#頻道/ someChannel,而不是網頁/#/頻道/ someChannel。此外,現在這些生成的路由根本不會調用路由器動作(刷新頁面時) –

+0

您能否顯示您現在阻止路由功能觸發的內容?在Backbone.js中,URL採用「host +」#「+ route」的形式。如果你的路由是「/ channel /:channelName」,那麼一個URL:http://host.com /#/ channel/someChannel應該可以工作,儘管可能會發生其他事情 – jackwanders

+0

我按照你的描述發佈: 1.將路由設置爲「/ channel /:channelName」:「changeChannel」 2.導航到「/ channel/...」 它沒有調用適當的路由器事件...當我從兩個點刪除引導斜槓時,它工作正常。 –