2011-12-07 5 views
8

Backbone.jsを使用すると、ルータを元の場所に移動することはできますか?ポップアップが表示されたときにURLを変更し、ポップアップを非表示にしたときにその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/'); 

これでURLが設定されます。 2番目のパラメータとしてtrueを渡すと、routesアクションも実行されます。それ以外の場合、ページは変更されません。

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

+8

もちろん、最後のURLがどのようにわかるのですか。バックボーンは便利な方法を提供していますか、それとも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 

次のヘルパーメソッドを作成しますフラグメントの保存と取得:

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

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

最後に、再ロードせずにURLを変更して結果のフラグメントを保存するために使用できる最終的なヘルパーメソッドが1つ必要です。ポップアップを閉じるときにこれを使用する必要があります。そうでない場合は、ユーザーが他の場所をナビゲートしなくてもポップアップを再び表示した場合、ヒストリに期待されるフラグメントはありません。これは、 "trigger:true"を指定しないでnavigateを呼び出すと、イベントハンドラがトリガされてフラグメントを格納しないためです。

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

この回答は質問には当てはまらないかもしれませんが、ほとんど同じ問題です。後続のスラッシュのために、私は前のルートまたはカスタムルートに静かにナビゲートできませんでした。ルート機能が起動されないようにするには、{trigger:false}を使用するか、またはfalseがデフォルトの動作であるためにトリガーを使用しないでください。ルートが '#/ something'(スラッシュに注意してください)の代わりに#somethingで始まることを確認するか、ルータ部分のBackbone.js内のregExを変更してください。

関連する問題