私はAngularが初めてですが、かなり読み続けています。 http://docs.angularjs.org/guide/directiveでng-transclude
について読んでいました。 #creating-custom-directives_demo_isolating-the-scope-of-a-directive そして、私はそれが何をするかを適切に理解していると思います。
次のようなコンテンツが含まれている要素に適用されるディレクティブがある場合
<my-directive>directive content</my-directive>
これにより、ディレクティブのテンプレート内の要素にng-transclude
のタグを付けることができ、要素に含まれるコンテンツはタグ付けされた要素内にレンダリングされます。
したがって、myDirective
のテンプレートが<div>before</div><div ng-transclude></div><div>after</div>
の場合、beforedirective contentafterとしてレンダリングされます。
これはすべてOKです私のQは、どういうわけか私のディレクティブにhtmlの単一ブロックよりも多くを渡すことは可能ですか?
例えば.
ディレクティブの使用法は次のようになります。
<my-multipart-directive>
<part1>content1</part1>
<part2>content2</part2>
</my-multipart-directive>
次のようなテンプレートがあります:
<div>
this: <div ng-transclude="part2"></div>
was after that: <div ng-transclude="part1"></div>
but now they are switched
<div>
としてレンダリング
<div>
this: <div ng-transclude="part2">content2</div>
was after that: <div ng-transclude="part1">content1</div>
but now they are switched
<div>
?
(自分で考えて)ノードのHTML値をモデルにバインドして、「トランスクルード」と呼ばずにそのような方法で使用できるようにすることができますか?.
ありがとう
Angular 1.5から、複数のスロットを作成できるようになりました。transclude:trueの代わりに、objectと各スロットのマッピング:
https://docs.angularjs.org/api/ng/directive/ngTransclude
angular.module('multiSlotTranscludeExample', [])
.directive('pane', function(){
return {
restrict: 'E',
transclude: {
'title': '?pane-title',
'body': 'pane-body',
'footer': '?pane-footer'
},
template: '<div style="border: 1px solid black;">' +
'<div class="title" ng-transclude="title">Fallback Title</div>' +
'<div ng-transclude="body"></div>' +
'<div class="footer" ng-transclude="footer">Fallback Footer</div>' +
'</div>'
};
})
いい質問です。組み込みの方法があるかどうかはわかりませんが、かなり一般的な方法で自分で行うことができます。
次のように$ transcludeサービスを渡すことで、transcluded要素にアクセスできます。
$transclude(function(clone, $scope) {
クローンは、事前リンクされたトランスクルージョンされたコンテンツのコピーになります。次に、次のように要素のコンテンツにラベルを付けると:
<div id="content">
<div id="content0">{{text}}</div>
<div id="content1">{{title}}</div>
</div>
コンテンツをループして、次のようにコンパイルできます。
$scope.transcludes.Push($compile(clone[1].children[i])($scope));
すごい!ここで、テンプレートの正しい場所にコンテンツを配置するだけです
'<div id="transclude0"></div>' +
'<div id="transclude1"></div>' +
次に、リンク機能でコンテンツを正しく割り当てることができます
angular.element(document.querySelector('#transclude' + i)).append(scope.transcludes[i]);
fiddle を設定します。この設定を使用して遊ぶことができます。
これが役に立てば幸いです!
私たちのプロジェクトでは、JSF 2のui:composition、ui:insert、ui:defineの後にマルチサイトトラスクルージョンをモデル化しました( i:composition を参照)。
実装は、ui-template、ui-insert、ui-defineの3つの単純なディレクティブで構成されます( angularjs-api/template/ui-lib.js を参照)。
テンプレートを定義するには、次のマークアップを記述します( angularjs-api/template/my-page.html を参照):
<table ui-template>
<tr>
<td ui-insert="menu"></td>
</tr>
<tr>
<td ui-insert="content"></td>
</tr>
</table>
ディレクティブを宣言します( angularjs-api/template/my-page.js を参照):
var myPage =
{
templateUrl: "my-page.html",
transclude: true
};
angular.module("app").
directive("myPage", function() { return myPage; });
最後に、ディレクティブをインスタンス化するには、記述する必要があります( angularjs-api/template/sample.html を参照):
<my-page>
<div ui-define="content">
My content
</div>
<div ui-define="menu">
<a href="#file">File</a>
<a href="#edit">Edit</a>
<a href="#view">View</a>
</div>
</my-page>
作業サンプルはrawgitで確認できます。 sample.html