2011-12-07 144 views
8

使用Backbone.js,是否可以使路由器導航到它來自的頁面?我希望在出現彈出窗口時更改我的URL的情況下使用它,並且當我隱藏彈出窗口時,我想要將其改回。我不想簡單地返回,因爲我希望保持背景頁面的位置與我在彈出窗口之前保留的位置完全相同使用Backbone.js默默地將url更改爲以前的版本

回答

14

您可以通過擴展Backbone.Router和導航過程中存儲的所有路由解決這個問題。

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
    @on "all", @storeRoute 
    @history = [] 
    super options 

    storeRoute: -> 
    @history.push Backbone.history.fragment 

    previous: -> 
    if @history.length > 1 
     @navigate @history[@history.length-2], true 

然後,當你不得不解僱你的模式,只需調用MyRouter.previous()方法,它會將您重定向到最後一個「哈希」。

+3

其實你可以簡單地只存儲最後的「散列」,而不是孔歷史 – mateusmaso

+0

謝謝!正是我在找什麼。 – Felipe

+0

我不相信這會保證在可能使用它的路由方法之前始終調用storeRoute方法。因此,歷史中存儲的內容將不一致。 – DrewB

-2

您可以在彈出或覆蓋的onCloseEvent中觸發一條路徑:

router.navigate('/lasturl/'); 

這將設置網址。如果您傳遞true作爲第二個參數,那麼您還將執行routes操作。否則,頁面將保持不變。

http://documentcloud.github.com/backbone/#Router-navigate

+8

當然,但問題是,我怎麼知道最後一個網址是? Backbone是否提供了一種有用的方法,或者我將不得不從window.history中獲取它? – user802232

1

我認爲mateusmaso的回答大多是正確的,但需要一些調整來保證你總能找到你正在尋找的正確的URL。

首先,你需要重寫的路徑方法有beforeRoute方法火:

route: (route, name, callback) => 
    Backbone.Router.prototype.route.call(this, route, name, => 
    @trigger('beforeRoute') 
    callback.apply(this, arguments) 
    ) 

然後你綁定事件並初始化歷史實例變量:

initialize: (options) ->  
    @history = [] 
    @on "beforeRoute", @storeRoute 

下創建的helper方法爲存儲和檢索片段:

storeRoute: => 
    @history.push Backbone.history.fragment 

previousFragment: => 
    @history[@history.length-2] 

最後,你需要一個最終的幫助器方法,可以用來更改URL而無需重新加載並存儲結果片段。在關閉彈出窗口時,您需要使用此功能,否則,如果用戶再次彈出而不在其他任何地方導航,則您的歷史記錄中不會包含期望的片段。這是因爲在沒有「trigger:true」的情況下調用導航將不會觸發事件處理程序來存儲片段。

changeAndStoreFragment: (fragment) => 
    @navigate(fragment) 
    @storeRoute() 
0

這個答案可能沒有解決這個問題,但它的優點大部分是相同的問題。我無法默默導航到之前的路線,或者因爲斜線後面的路線而導致自定義路線。爲了使路由功能不被觸發,請使用{trigger:false},或者根本不要使用觸發器,因爲false是默認行爲,請確保您的路由以#something開頭,而不是'#/ something'(請注意斜槓),或者更改Backbone.js(路由器部分)中的regEx。