左パネルと右パネルを持つ body ディレクティブを追加しようとしています。しかし、これらのパネルの間に、body ディレクティブ専用のコンテンツがいくつかあります。現在、transclude=trueオプションを使用してコンテンツをロードしています。しかし、2 つの ng-transclude を使用する方法を探しています。それを解決する方法をたくさん調べましたが、エレガントな解決策を見つけることができませんでした。body ディレクティブのコンパイル手順で、トランスクルードされたオブジェクトを手動で追加する必要がありました。以下は私がそれを解決した方法です:
ボディ ディレクティブ
var myApp = angular.module('myApp', []);
myApp.directive('body', function () {
return {
restrict: 'A',
transclude: true,
scope: {
title: '@'
},
templateUrl: 'body.html',
compile: function compile(element, attrs, transclude) {
return function (scope) {
transclude(scope.$parent, function (clone) {
for (var i = 0; i < clone.length; i++){
var el = $(clone[i]);
if(el.attr('panel-left') !== undefined) {
element.find('#firstPanel').html(el);
} else if(el.attr('panel-right') !== undefined) {
element.find('#secondPanel').html(el);
}
}
});
}
}
};
});
myApp.directive('panelLeft', function () {
return {
require: "^body",
restrict: 'A',
transclude: true,
replace: true,
template: '<div ng-transclude></div>'
};
});
myApp.directive('panelRight', function () {
return {
require: "^body",
restrict: 'A',
transclude: true,
replace: true,
template: '<div ng-transclude></div>'
};
});
テンプレート
<script type="text/ng-template" id="body.html">
<h1> {{title}} </h1>
<hr/>
<div id="firstPanel" class="inner-panel"></div>
<div id="innerMiddleContent" class="inner-panel">middle private content here</div>
<div id="secondPanel" class="inner-panel"></div>
</script>
<div body title="Sample Body Directive">
<div panel-left>
Public content that goes on the left
</div>
<div panel-right>
Public content that goes on the right
</div>
</div>
この例の JSFiddle は次のとおりです。私はこのようなものを探しています:
あると便利なテンプレート
<script type="text/ng-template" id="body.html">
<h1> {{title}} </h1>
<hr/>
<div id="firstPanel" class="inner-panel" ng-transclude="panel-left"></div>
<div id="innerMiddleContent" class="inner-panel">middle private content here</div>
<div id="secondPanel" class="inner-panel" ng-transclude="panel-right"></div>
</script>
質問: 私は何か間違ったことをしていますか? この問題を解決するための推奨される方法はありますか?