これまでのWeb開発技術では、ページ遷移時に遷移先ページヘデータを渡すには、GETやPOSTを使ってました。
PHPと相性がよくて、 $_POST とか $_GETで取得できたので、便利でした。
しかしAngular JSはSPA(シングル・ページ・アプリケーション)です。
いちいちページのデータをサーバに取りに行くのではなく、最初に全部のページデータをロードしてしまうので、考え方が今までとは異なります。
SPAのページ遷移は疑似的な遷移であり、切り替わったように見えるだけです。AngularJSではページ遷移という表現が適切ではないのかもしれませんが、あえてページ遷移と呼称します。
ページ遷移とUI-router
例えば、ng-repeatでデータを列挙し、その中の1つをタップすると、タップしたデータの詳細説明ページへ遷移したいとき。
以下のように書くことで実現できます
<!-- 前略 ここはページAです -->
<script id="pageA.html" type="text/ng-template">
<div ng-controller="pageACtrl">
<div class="list">
<a ng-repeat="i in Data" class="item" ui-sref="pageB({msg:i.msg})">
<!--データの項目名を書く -->
{{i.title}}
</a>
</div>
</script>
<!-- 中略 ここからはページBです -->
<script id="pageB.html" type="text/ng-template">
<div ng-controller="pageBCtrl">
<p>{{info}}</p>
</div>
</script>
angular JS
//前略
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise("/");
$stateProvider
.state('pageA', {
url: "/",
templateUrl: "pageA.html",
})
.state('pageB', {
url: "/pageB/{msg}", //ここで、{msg}に、htmlのリンク設定した{msg:i.msg}が格納される
templateUrl: "pageB.html",
})
})
//中略
.controller('pageACtrl', function($scope) {
$scope.Data = [
{"title":"商品A" , "msg":"これは耐熱性のある商品"},
{"title":"商品B" , "msg":"廉価版です"},
{"title":"商品C" , "msg":"人気NO1"}
];
})
.controller('pageBCtrl', function($scope , $stateParams) {
$scope.info = $stateParams.msg; //これでURLにセットされた値(msg)が取得できる
console.log($scope.info);
})
UI Routerはパラメータがいっぱいあってちょっととっつきにくいですね。
通常のGETなら、URLのおしりに?をつけるだけで簡単だったのですが、色々回りくどくて大変です。
でもng-repeatと組み合わせると便利ですね。
ui-routerのおまけ
URLパラメータを2つ以上送る場合は、次のようになります
HTML
<a ng-repeat="i in Data" class="item" ui-sref="show({id:i.id,msg:i.msg})">
<!-- カンマで区切って列挙していく -->
Angular JS
.state('pageB',{
url:'/pageB/{id}/{msg}',
templateUrl:"show.html"
})
//中略
.controller('pageBCtrl', function($scope , $stateParams) {
$scope.id = $stateParams.id;
$scope.msg = $stateParams.msg;
})

