AngularJSカスタムディレクティブのtranscludeオプション、ng-transcludeディレクティブの使用例をまとめました。
デモとコードサンプルはこちら。
(1)概要
下記のようにカスタムディレクティブ内に記述したコンテンツをテンプレート内のパネルボディ部に挿入したい場合を考えます。
(HTML内のカスタムディレクティブ)
<panel>”カスタムディレクティブ内のコンテンツ”</panel>
(カスタムディレクティブのテンプレート)
<div class=”panel panel-default”>
<div class=”panel-heading”>
<h4>{{title}}</h4>
</div>
<div class=”panel-body”>
<p>”カスタムディレクティブ内のコンテンツ”</p>
</div>
</div>
transcludeオプションを使用せず、templateオプションのみを使用した場合、カスタムディレクティブ内に記述したコンテンツはtemplateで定義した内容に置き換わってしまいます。
transcludeオプションを使用すると、カスタムディレクティブ内で記述コンテンツをテンプレート内の指定した場所に埋め込む事が出来ます。
(2)transcludeオプション、ng-transcludeディレクティブの使用方法
①カスタムディレクティブの定義でtranscludeオプションを設定
demoApp.directive("panel", function () { return { restrict: "E", scope: { title:'@' }, transclude: true, } });
②HTMLでカスタムディレクティブを適用
<panel title=”{{title}}”>{{text}}</panel>
③ng-transcludeディレクティブでテンプレート内の埋め込む場所を指定
テンプレート内の埋め込みたい場所にng-transcludeを指定します。
<div class="panel panel-default"> <div class="panel-heading"> <h4>{{title}}</h4> </div> <div class="panel-body"> <p ng-transclude></p> </div> </div>
※ng-transcludeのスコープ
サンプルコードでは下記構成になっていて、コントローラ(”transCtrl”)とカスタムディレクティブ(”panel”)とng-transcludeディレクティブでそれぞれスコープを持っています。
<div ng-controller=”transCtrl”>
<panel title=”{{title}}”>{{text}}</panel>
</div>
ng-transcludeディレクティブのスコープは親スコープ(”transCtrl”)から継承され新しく生成されたスコープで隔離スコープといえます。
カスタムディレクティブも隔離スコープとして設定しているので、ng-trnscludeとカスタムディレクティブのスコープは同じ親スコープから継承されて生成された兄弟の関係で、互いに隔離されています。
ng-transcludeが設定されているとAngularJSは、カスタムディレクティブ内に記述されたコンテンツ({{text}})をテンプレートの内容で置換する前にコピーして退避し、テンプレート内に埋め込みます。{{text}}は親スコープ(”transCtrl”コントローラ)で定義された変数ですが、transcludeディレクティブのスコープは親スコープを継承しているので参照する事が出来ます。
- ビルトインのディレクティブの概要
- データバインディングのディレクティブの概要
- ng-repeatを使ってリスト、テーブル、フィルター
- ng-includeを使って別のHTMLファイルを埋め込み
- ng-switchを使って内部にあるHTMLテンプレートの表示を切り替え
- ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
- ng-class、ng-styleを使ってCSSを設定
- イベント処理
- 有効、無効を切替えるディレクティブ
- フォームの入力チェックを行い、動的にCSS追加
- ng-optionsを使ってSelectメニューを作成
- ng-repeatを使ってラジオボタンを作成
- ビルトインのフィルターの使用方法
- ビルトインのフィルターで関数を使用
- カスタムフィルターの使用方法
- Bootstrap3を使ってページング
- スクリプト内でフィルターを使用、既存のフィルターを拡張
- サービスの概要とfactory、service、providerの使い分け
- $qサービスでpromise/deferredパターン
- $httpサービスの概要、サーバーからJSONデータ取得
- $httpサービスのPOSTでデータ送信
- $qサービスを使ってhttpリクエストを複数実行
- $httpサービスのinterceptorの使用方法
- AngularJSのwithCredentialsの設定、CORS
- $timeoutサービスと$intervalサービス
- $resourceサービスを使ってREST
- $locationサービスを使ってURLを操作
- $routeサービスと$resourceサービスを使ったサンプルを作成
- routeChangeSuccessを使ってflashメッセージ表示
- JavaScript、CSSを含むHTMLデータをバインドして表示
- ビルトインのディレクティブの概要
- データバインディングのディレクティブの概要
- ng-repeatを使ってリスト、テーブル、フィルター
- ng-includeを使って別のHTMLファイルを埋め込み
- ng-switchで内部にあるHTMLテンプレートの表示を切り替え
- ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
- ng-class、ng-styleを使ってCSSを設定
- イベント処理
- 有効、無効を切替えるディレクティブ
- フォームの入力チェックを行い、動的にCSS追加
- ng-optionsを使ってSelectメニューを作成
- ng-repeatを使ってラジオボタンを作成
- ビルトインのフィルターの使用方法
- ビルトインのフィルターで関数を使用
- カスタムフィルターの使用方法
- Bootstrap3を使ってページング
- スクリプト内でフィルターを使用、既存のフィルターを拡張
- サービスの概要とfactory、service、providerの使い分け
- $qサービスでpromise/deferredパターン
- $httpサービスの概要、サーバーからJSONデータ取得
- $httpサービスのPOSTでデータ送信
- $qサービスを使ってhttpリクエストを複数実行
- $httpサービスのinterceptorの使用方法
- AngularJSのwithCredentialsの設定、CORS
- $timeoutサービスと$intervalサービス
- $resourceサービスを使ってREST
- $locationサービスを使ってURLを操作
- $routeサービスと$resourceサービスを使ったサンプルを作成
- routeChangeSuccessを使ってflashメッセージ表示
- JavaScript、CSSを含むHTMLデータをバインドして表示