Edited at

Backbone.js入門 「Router と History」

More than 5 years have passed since last update.


閲覧上の注意

この記事で対象としているバージョン0.5.3は結構古いので注意してください。

その他の割りと新しい情報は Backbone.js Advent Calendar 2012 などにあります。

(追記ここまで)


Backbone.js入門の最終回は RouterHistory です。

Backbone.js入門 「MVC」で述べたように、URL が変更された時に発生する popstate または hashchange イベントを監視してルーチンを起動するのが Router の役目です。HistoryRouter の裏方で頑張る実体で、直接操作することはほとんどありません。

URL が変更された時にアクセスされるのが Router なので、Rails 的な MVC の枠組みで言えばコントローラと言えますし、伝統的な MVC で言えば全てのアンカーとブラウザの進退ボタンを管理するビューだと言えます。View がビューとコントローラの役割を両方もっていたように、Router も両方の役割を負っていると考えるのが自然でしょう。


基本的な使い方

MyRouter = Backbone.Router.extend({

routes: {
"foo/:hoge": "bar" // (1)
},
bar: function (hoge) {
alert(hoge); // (2)
}
});

new MyRouter();
Backbone.history.start();

このような設定があるとき <a href="#foo/hogehoge">foo</a> をクリックすると、URL のハッシュ値が #foo/hogehoge に変更されます。

その上で、(1) に記述されたルールが適応され bar が実行されます。routes にある :hoge という部分に対応する hogehoge が代入されて bar に渡されます。その結果 (2) が実行されて hogehoge とアラートされます。


pushStateを使う

HTML5 の pushState が使えるブラウザではハッシュではなく、pushState を用いたルーティングをするように内部で書き換えることができます。

Backbone.history.start({pushState: true});

この時、どこまでが実際の url でどこからがハッシュ値なのかが分からないため root で教えてやる必要があります。

Backbone.history.start({pushState: true, root: "/hoge/"});

これにより、pushState によって URL が /hoge/foo に変更されるとその際に発生する popstate イベントに反応して (2) が実行されるようになります。

上で使った <a href="#foo/hogehoge"> をクリックすることで popstate をさせたい場合は、jQuery と後述する navigate を使って次のように書くことができます。

router = new MyRouter();

$("a[href^=#]").bind("click", function (e) {
router.navigate($(this).attr("href").substr(1), true);
e.preventDefault();
});

これにより /hoge/foo/hogehoge に URL が変わり、hogehoge と アラートされます。

pushState を有効にすることで、リソースを異なるページで管理しているように見せかけることができるようになりますが、以降でユーザが直接その URL にアクセスしてきたとしても同様のページを表示するようにしなければなりません。


Router#navigate(fragment, [triggerRoute])

明示的にルーティングを変更します。triggerRoute に true を渡すと URL の書き換えと同時に、対応するコールバック関数を実行します。


おわりに

以上で Backbone.js 入門は終わりです。

今回の一連の連載記事で Backbone.js で用いるオブジェクト達の利用方法を一通り見てきました。

これから Backbone.js を使ってみようと思う方の役にたてていれば幸いです。

Backbone.js は世界的に広く使われ始めた JavaScript フレームワークですが、日本ではまだそれほど多くの導入事例があるわけではありません。

一緒に Backbone.js を盛り上げていきましょう!



  1. Backbone.js入門 Events

  2. Backbone.js入門 MVC

  3. Backbone.js入門 View

  4. Backbone.js入門 Model

  5. Backbone.js入門 ViewとModelの連携

  6. Backbone.js入門 Collection

  7. Backbone.js入門 ViewとModelとCollectionの連携

  8. Backbone.js入門 RouterとHistory