編集:これに答えたとき、私は完全に間違っていたので、私の答えを完全かつ完全に変更し、これを「コミュニティWiki」(私にとってはポイントがないことを意味します)としてマークします
@Jonahが以下で指摘したように、ディレクティブのコンパイルオプションとtransclusion関数の使用に関する非常に良い記事があります
基本的な考え方は、コンパイル関数がリンク関数を返す必要があるということです。リンク関数内で提供されるトランスクルージョン関数を使用して、トランスクルージョンされた DOM 要素のクローンを取得し、コンパイルして、挿入する必要がある場所に挿入できます。
これは、Plunker でお尻から引き抜いたより良い例です。
コンパイル関数の考え方は、リンク関数が作成されて呼び出される前に、渡された属性に基づいて DOM 要素をプログラムで変更できるようにすることです。
// a silly directive to repeat the items of a dictionary object.
app.directive('keyValueRepeat', function ($compile){
return {
transclude: true,
scope: {
data: '=',
showDebug: '@'
},
compile: function(elem, attrs, transclude) {
if(attrs.showDebug) {
elem.append('<div class="debug">DEBUG ENABLED {{showDebug}}</div>');
}
return function(scope, lElem, lAttrs) {
var items = [];
console.log(lElem);
scope.$watch('data', function(data) {
// remove old values from the tracking array
// (see below)
for(var i = items.length; i-- > 0;) {
items[i].element.remove();
items[i].scope.$destroy();
items.splice(i,1);
}
//add new ones
for(var key in data) {
var val = data[key],
childScope = scope.$new(),
childElement = angular.element('<div></div>');
// for each item in our repeater, we're going to create it's
// own scope and set the key and value properties on it.
childScope.key = key;
childScope.value = val;
// do the transclusion.
transclude(childScope, function(clone, innerScope) {
//clone is a copy of the transcluded DOM element content.
console.log(clone);
// Because we're still inside the compile function of the directive,
// we can alter the contents of each output item
// based on an attribute passed.
if(attrs.showDebug) {
clone.prepend('<span class="debug">{{key}}: {{value}}</span>');
}
//append the transcluded element.
childElement.append($compile(clone)(innerScope));
});
// add the objects made to a tracking array.
// so we can remove them later when we need to update.
items.push({
element: childElement,
scope: childScope
});
lElem.append(childElement);
}
});
};
}
};
});