SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

AngularJSではじめるJavaScriptフレームワーク開発スタイル

もうすぐリリースされるAngularJS 1.4の機能を先取りチェックしよう

AngularJSで初めるJavaScriptフレームワーク開発スタイル 第9回


仕様変更があった機能

 仕様変更があり、推奨されない機能となったものや、または、既存のコードに多少の変更が必要になってしまった機能を紹介します。

ngCookies - 新しいクッキー管理

 バージョン1.3までは$cookiesと$cookieStoreがありましたが、$cookieStoreが、今後利用が推奨されないようになり、$cookiesサービスを使うことになりました。

 ただし、$cookieStoreはそのまま利用可能ですので、$cookieStoreを使ってクッキーを制御している方は現在のところ変更の対応は必要ないでしょう。

 また新しい$cookiesサービスは、これまでの$cookieStoreと同じような使い方ができるのはもちろん、クッキーの保存の際に有効期限や、Secureなどのオプション指定ができるようになりました。これにより高度なWebセキュリティを保つことができるようになったので大変助かる方もいるのではないかと思います。

 新しい$cookiesサービスの使い方はリスト6のようになります。

リスト6 クッキーの使い方の変更点(cookies/app.jsの抜粋)
module.controller('Cookie14Controller',['$scope','$cookies',function($scope,$cookies){
    // : (省略)
    //  (1) 単純な値の取得と保存
    var uid = $cookies.get('tmp_id');
    if(!uid) {
        uid =  "123456";
        $cookies.put('tmp_id', uid);
    }
    //  (2) オブジェクト形式の取得と保存
    var getObj = $cookies.getObject('key');
    var obj = {
        key : 'sample'
    };
    $cookies.putObject('key',obj);
    var opts = $cookies.get('opts');
    console.log(opts);
    //  (3) クッキー保存時にオプションを指定
    $cookies.put('opts','value',{
        path : '/',
        expires : new Date(2015,7,1)
        // secure : false,
        // domain : 'www.coltware.com'
    });
    //  (4) 保存してあるクッキーの値をすべて取得する方法
    console.log($cookies.getAll());
}]);

 (1)ではget/putメソッドを用いて単純なクッキーの値を扱っています。続いて(2)ではオブジェクト形式の値の管理ですが、バージョン1.4からはgetObject/putObjectを使うようになりました。

 内部ではJSON形式でのシリアライズ処理をしています。putObjectメソッドで設定した値をgetメソッドで取得するとJSON形式の文字列になってしまいます。(3)ではクッキーの値の保存時にオプションを指定しています。オブションには、path、expires(有効期限)、secure(SSL時の扱い)、domainの4つが指定可能です。(4)のようにクッキーに保存されている値を一度に取得するメソッドも追加されています。

ngMessages - 分割可能なメッセージテンプレートと変数を使った一致条件の指定

 ngMessagesモジュールでng-messages-include属性を利用している場合に、バージョン1.3までのコードでは動作しなくなってしまいました。具体的にはng-message-include属性がng-messageディレクティブのオプションではなくなり、独立したディレクティブになります。このため、リスト7のように変更する必要があります。

リスト7 ng-messages-includeを使っている場合の対応(messages/index.htmlとmessage/index13.htmlの抜粋)
//  1.3での記述方法
<div ng-messages="errors" ng-messages-multiple ng-messages-include="err-messages" class="errors">
//  1.4での記述方法
<div ng-messages="errors" ng-messages-multiple class="errors">
    <div ng-messages-include="err-messages"></div>
</div>

 この変更により、ngMessagesディレクティブは複数のngMessagesIncludeを持つことができるようになったので、メッセージ定義を分割して管理できるようになりました。

 また、新たな機能としては、ngMessageExpディレクティブが追加されました。ngMessageディレクティブでは文字列の指定でしたが、変数などの表現で指定できるようになりました。

リスト8 ng-message-expを使った場合の例(messages/index.htmlの抜粋)
<div ng-init="pref = {tokyo : true}; val = 'tokyo'"></div>
<div ng-messages="pref">
    現在地は「
    <span ng-message-exp="val">東京都</span>
    <span ng-message-exp="'okinawa'">沖縄県</span>
    」です
</div>

ngRepeat/ngOptionsでの表示順が指定した順番に変更

 ngRepeatやngOptionsでオブジェクトを指定すると、これまでは自動的にプロパティ名でソートされてしまいました。多くの方にとって、これはあまり望ましい仕様ではなかったとは思いますが、これらの機能に頼っていた方は注意が必要です。

 例えば、リスト9のようなオブジェクトをngRepeat/ngOptionsに指定すると図2に示すようにkey1、key2、key3の順番で表示されてしまっていましたが、今後は指定した順番で表示されるようになり直感的になりました。

図2 ngRepeatの1.4と1.3での表示順の違い
図2 ngRepeatの1.4と1.3での表示順の違い
リスト9 ngRepeatでの表示順番の変更のサンプルコード(repeat/app.jsとrepeat.htmlの抜粋)
// repeat/app.jsの抜粋
$scope.map = {
  key3 : 'value3',
  key2 : 'value2',
  key1 : 'value1'
};
// repeat/index.htmlの抜粋
<ul>
     <li ng-repeat="(key, value) in map">{{key}}={{value}}</li>
</ul>

最後に

 今回紹介しきれなかったものがいくつかありますので、CHANGELOG1.3から1.4へのマイグレーション方法などを参照することをおすすめします。

 今回はマイナーバージョンアップと言うことで、多少の既存コードに影響がありますが、それよりも、このようにバージョンアップが重ねられていることにより、ユーザニーズに即した機能が追加されることの方が受ける恩恵は大きいと思います。また、1.4と同時にリリースされる予定であるngNewRouterは、今回紹介できませんでしたが、Angular 2を想定した作りになっているようです。AngularJS 2はJavaScriptそのものの拡張までも考慮された意欲的なフレームワークを目指しているようで、JavaScriptの今後に興味がある方ならば、このようなAngularJSが目指すべき方向性がどうなるのかも興味があるところでしょう。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
AngularJSではじめるJavaScriptフレームワーク開発スタイル連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8698 2015/06/15 13:58

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー