Backbone.jsを使用して、ルーターを元のページに移動させることはできますか?ポップアップが表示されたときにURLを変更し、ポップアップを非表示にしたときに元に戻したい場合に使用したいと思います。ポップアップを表示する前に残したのとまったく同じ位置に背景ページを保持したいので、単純に戻りたくありません。
4 に答える
この問題は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()
ある場合は、最後の「ハッシュ」にリダイレクトするメソッドを呼び出すだけです。
mateusmasoの答えはほとんど正しいと思いますが、探している正しいURLを常に取得できるように、いくつかの調整が必要です。
まず、beforeRouteメソッドを起動するためにrouteメソッドをオーバーライドする必要があります。
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()
この答えは質問に対処しないかもしれませんが、それはほとんど同じ問題です。前のルート、または末尾のスラッシュが原因でカスタムルートにサイレントにナビゲートできませんでした。ルート関数がトリガーされないようにするには、がデフォルトの動作である{trigger:false}
ため、トリガーを使用するか、まったく使用しないでください。ルートが「#/ something」(スラッシュに注意)ではなくfalse
始まることを確認するか、正規表現を変更してください。 #something
Backbone.js内、ルーター部分。
ポップアップまたはオーバーレイのonCloseEventで、次の方法でルートをトリガーできます。
router.navigate('/lasturl/');
これにより、URLが設定されます。2番目のパラメーターとしてtrueを渡すと、routesアクションも実行されます。それ以外の場合、ページは変更されません。