2012-11-19 94 views
0

我似乎無法讓骨幹路由器以預期的方式工作。我)實例化我的路由器,然後ii)調用Backbone.history.start({pushState:true,root:'/'})。用下面的代碼...骨幹路由器混淆如何觸發

  • 1)將 「/儀表板」 或 「/網格」,所定義的函數不稱爲
  • 2)當調用myrouter.navigate( 「網格」),定義的函數不叫
  • **)但是,如果我然後回顧或轉發歷史,則定義的函數被調用。
Router : Backbone.Router.extend 

     routes: 
      "dashboard":     "dashboard" 
      "grid/:storyid":    "grid" 

     dashboard: -> 
      console.log("...") 

     grid: (storyid) -> 
      console.log("...") 

我需要什麼做的就是案件1),2)工作?

謝謝

+0

您是否創建了路由器實例並開始歷史記錄跟蹤? IE這一點:'Backbone.history.start()' – asawyer

+0

是的。 'myrouter = new router.Router()',然後'Backbone.history.start({pushState:true,root:'/'})''。 – Nutritioustim

+0

您可以嘗試將「儀表板」路線放在前面,以便它顯示爲:「/ dashboard」:「儀表板」 – Roger

回答

1

您的路由器正在按照它應有的工作。我認爲你對它是如何工作的,以及爲什麼的期望是關閉的。

1)將「/儀表板」或「/網格」,當你輸入「/儀表板」或「/格」到瀏覽器的地址欄定義的函數不叫

,您的瀏覽器會向您的服務器發出請求以獲取該網址。這會繞過路由器,因爲瀏覽器正在將請求發送回服務器。

唯一一次在瀏覽器的URL輸入中輸入URL不會向服務器請求新頁面,也就是當您只修改哈希片段時:「#whatever」。

當調用myrouter.navigate(「網格」),該定義的函數不叫

router.navigate默認行爲是更新URL瓦特/合適的途徑,但不是這條路由路由器處理 - 正是你所描述的。

如果你想迫使瀏覽器處理路由變化,通過true作爲第二個參數:myrouter.navigate("grid", true)

**)但是,如果我再回去或轉發throught的歷史,那麼定義函數被調用。

這工作,因爲路由器本身註冊瓦特/瀏覽器的歷史API,並有機會以處理由FWD /後退按鈕造成的URL變化,瀏覽器離開前回服務器以獲取請求的URL。

+0

我最終通過在* myobj *上創建了一個'navi'函數包裝來解決這個問題。這個包裝只是調用'this.navigate(「asdf」,{trigger:true})',這給了我預期的行爲。然而,我仍然覺得這很令人沮喪,因爲直接調用'myobj.navigate(「asdf」,{trigger:true})'給我留下了我在這裏報告的這個問題。但您提供的解決方案也可行。我很困惑,爲什麼A)myobj.navigate(「asdf」,true)'工作,但B)'myobj.navigate(「asdf」,{trigger:true})'不。爲什麼包裹在B)的呼叫,突然讓這個電話工作。我覺得它很詭異。 – Nutritioustim