AngularJSでURL内のパラメタから値を読み取る方法(ng-view, templateUrlなしで!)


ちまたで話題のAngularJSですが、URLのパラメタに関する部分で詰まったので書いてみます。

前提

ここでいうURLのパラメタとは例えば、“http://example.com/#/2014/02”というURLで2014や02の部分ことです。これをJavaScript内で値として使いたい!というケースを想定しています。

http://example.com/#/?message=hello”など?に続く文字列、query stringも同様です。これも含めてここではパラメタと呼ぶことにします。

パラメタは$routeParamsを使う

URLのパラメタをどのように取得すればよいのか。これについては少し検索するといくつか情報が出てきます。

例えば公式のAPIは以下のようになっています。

AngularJS Documentation for $routeParams

残念ながらTutorialではないので、十分なサンプルコードが得られません。初心者には少し厳しいです・・。

良いサンプルは無いかと検索すると以下が見つかります。このサイトはお勧めです。AngularJS界隈でこの人のサンプルは重宝されているようです。

AngularJS - $routeParams | Thinkster

自分で書いてみる(ng-view, templateUrlありバージョン)

先人達の知恵を借りて自分でもコードを書いてみます。単純にURLに/2014/02というようなパラメタを与えたとき、“2014年 02月”というように表示するコードを書いてみます。

http://plnkr.co/edit/7oaZtlGHpcKLsWLyHZjk?p=preview

コードは上記のPlunkerからご覧ください。Linkを叩いて…/#/2014/02にアクセスするか、Plunkerのプレビューを別窓で開いてURLに好きな文字列”/#/年/月”を入力してください。

ポイントは以下です。

  • angular-route.jsを利用する
  • angular.module(“app”, [“ngRoute”])と記述し、ngRouteモジュールを利用する
  • $routeProviderでパラメタをマッピングする

この方式だとtemplateUrlとng-view(またはng-include)を利用することが必要です。別に分割しなくていいので、index.htmlだけで何とかさせてくれー!と散々悩まされました。

自分で書いてみる(ng-view, templateUrlなしバージョン)

ほとんどangular-seedというAngularJSプロジェクトテンプレートのサンプルに助けられました。

http://plnkr.co/edit/D3dYj6fBt8NmvK8nJbkj?p=preview

このサンプルではng-viewもtemplateUrlも利用していません。template.htmlも存在しません。

上記のようにすればそれらなしで機能を実現することができます。runや$routeScopeのonが重要なんだと思いますが、まだこのあたりは調べられていないです。

どなたかの助けになれば幸いです。

ところでPlunkerって便利ですね!