対象読者
- jQueryなどを使っている開発者
- JavaScriptを使った複数人でのプロジェクトに参加している方
- JavaScriptを使ってサーバ等と連携したフロントエンドの開発をしている方
必要な環境
この記事では、AngularJS(バージョン1.4)を使用し、Chrome(43.0)、IE11、Firefox(39.0)、Safari(8.0.7)の環境にて確認を行っています。
また、Bootstrap(バージョン3.3.5)とjQuery(2.1.4)を使用しています。
値の参照のみを行うUIの作成
まず、最初は前回までの復習をかねて、値の参照のみを行う非常に簡単な部品を作成してみます。最初は図1のようにProgres barを部品化します。
まずはBootstrapのマニュアルにあるProgress barのサンプルコードを元にテンプレートをリスト1のように作成します。
<div class="progress"> <div class="progress-bar" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="100" ng-style="{width : value + '%'}"> <span ng-show="value > 0">{{value}}%</span> </div> </div>
このテンプレートの0から100までのvalueの値に応じてバーの長さを変えます。実際にこのディレクティブを使う際には、リスト2のように利用します。
このように、ディレクティブは複雑なタグ要素、または、属性やクラス名などを必要とするHTMLを簡単に管理することができます。
<progressbar value="'20'"></progressbar>
実際に作成したディレクティブ本体のコードがリスト3になります。
(function(){ angular.module('ui.progressbar',[]) .directive('progressbar',[ProgressBar]); function ProgressBar(){ return { restrict : 'E', templateUrl : "js/directives/ProgressBar.html", scope : { value : '=' //(1)valueの値はAngularJS式として取得する }, replace : true //(2)HTMLを置き換える } } }());
前回説明したrestirct、templateUrl、scopeの詳細は割愛しますが、restrictでは要素(E)でのみ指定が可能で、templateUrlは表示するテンプレートのURLです。
また、(1)のようにscopeでは指定したvalue属性の値をAngular式として値のバインディングができるようにします。これで、コントローラなど上位のスコープの値を参照できますので、リスト1のようにコントローラ側で値を変えればプログレスバーを動かす事ができます。
続いて(2)replace属性は指定したテンプレートで要素を置き換えるか否かの指定です。replaceがfalseの場合、progressbar要素の内側にテンプレートを挿入しますが、trueの場合にはすべて書き換えるのでDOM上にはprogressbar要素は残りません。ただし、現在、replace指定はDEPRECATEDになっています。理由としては指定した属性やクラス指定などをテンプレート側の親要素とマージしますが、その実装と制約などが複雑になることと、今後、独自タグがWebComponentとして標準化されていくので、無理に置き換える必要はないであろうというのが理由のようです。