2014-02-07 13 views
8

我目前正在爲我的SPA使用Backbone路由器。這類型的作品不錯,但我有一些小問題:備用到沒有散列回退和更好的回退/轉發狀態支持的Backbone路由器?

的問題是 - 我想要麼有pushState導航或沒有,意思是 - 應用程序狀態被執行(當我通過「初始」或者我通過JS觸發路由),但地址欄不會改變。我不希望IE9的hashChange回退。如果IE9沒有獲得後退按鈕和改變的地址欄,它會工作得很好,但仍然保持應用程序內的導航狀態。然後,我可以向用戶顯示可以書籤的URL,服務器將路由該頁面,並且應用程序狀態將根據初始URL進行引導。在應用內導航期間,地址欄不會改變,這是我願意接受的一種折中方案。

我的另一個問題是我使用navigate(url, {trigger: true})來截取我的HREF,而後退按鈕不起作用(什麼都不做)。但我真的需要改變前進/後退導航的應用程序狀態,即使它被重建爲特定的URL - 我寧願重建狀態。

我可以在路由器方面使用哪些選項?就像我說的,我不想有散列回退(意思是 - 我只想在應用程序中有一種表示URL的方式)。

我應該使用什麼? Director.js? History.js?似乎有相當多的路由器/歷史庫在那裏,但哪一個是最接近我正在尋找?

+0

嘗試http://millermedeiros.github.io/crossroads.js – mfirry

+0

嗨@Julik,當你說'地址欄不會改變'這意味着,如果你寫最初的路徑例如'domain.com/page/one'它會渲染內容,並且會永遠停留在那個路徑中?即使你導航到不同的頁面? –

+0

我的意思是在IE上,我會攔截對'a'元素的點擊並改變應用程序狀態以響應,但它不會被記錄在瀏覽器歷史記錄中 - 並且URL將保持在頁面加載時的位置。 – Julik

回答

2

假設你有Modernizr圍繞掃描HTML5的歷史支持,如果我明白好會不會「T快速的解決方案來,在主佈局js文件,添加爲事件

'click a' : "navigate" 

,並添加功能導航到此佈局遵循

navigate : function(e){ 
    if(!Modernizr.history) document.location.href = $(e.currentTarget).attr("href"); 
}, 

優化,你當然可以綁定的只有在歷史不被支持的情況下,不要忘記包括「現代化「在您的佈局。希望這是一個有趣的答案你..

+0

我可以做到這一點,但這將做一個完整的頁面重新加載,而我只想改變內部應用程序狀態。 – Julik

+0

好吧,那麼爲什麼不使用自定義事件而不是路由?我的意思是比如在上面創建的導航功能做你的佈局 'this.trigger(「GOTO」,{whateverParamsYouNeedHere:真});' 和你的路由器在初始化你做 'VAR是這個= ; this.listenTo(thelayoutyouobserve,「goto」,function(e){this.controller.theFunctionToNavigate(e.whateverParamsYouNeedHere);});' – bastien

+0

因爲我的大部分應用程序結構都基於URL,即使它們可能不是在地址欄中可見。所以我不想將處理程序附加到UI的特定元素,但是由於具有正確的HREF屬性,它們可以觸發路由器。 – Julik