私のコントローラには、ディレクティブを作成するためにng-repeatが使用するリストがあります。私のディレクティブでは、ディレクティブの要素に追加するためにtransclusionを使用します。AngularJS:ディレクティブに含まれるコンテンツは消えます。
私のリストに最初のアイテムを追加すると、期待どおりに動作するようですが、2番目のアイテムを追加すると、最初のアイテムの要素から継承されたコンテンツが消えます。これは私には意味がないので、私が誤解しているものがなければなりません。
私はこの問題を再現したexampleを作成しました。
最初の項目が追加された後に予想されるように、HTMLはなります
<div ng-controller="ctrl as c" class="ng-scope">
<test ng-repeat="item in c.items track by $index" item="item" class="ng-scope ng-isolate-scope">
<div class="ng-binding">1</div>
<span class="ng-scope">Transcluded</span>
</test>
</div>
2番目の項目が追加された後、トランスクルードコンテンツは最初の項目の要素でなくなりました!
<div ng-controller="ctrl as c" class="ng-scope">
<test ng-repeat="item in c.items track by $index" item="item" class="ng-scope ng-isolate-scope">
<div class="ng-binding">1</div>
</test>
<test ng-repeat="item in c.items track by $index" item="item" class="ng-scope ng-isolate-scope">
<div class="ng-binding">2</div>
<span class="ng-scope">Transcluded</span>
</test>
</div>
HTML:
<div ng-app="ui">
<div ng-controller="ctrl as c">
<test ng-repeat="item in c.items track by $index" item="item">Transcluded</test>
</div>
</div>
活字体:
var app = angular.module('ui', []);
class Controller {
public items = [];
constructor($timeout) {
$timeout(() => this.items.push({Id: 1}), 1000);
$timeout(() => this.items.push({Id: 2}), 2000);
}
}
app.controller('ctrl', ['$timeout', Controller]
app.directive('test', function($compile) {
return {
scope: {
item: '='
},
transclude: true,
template: "<div>{{item.Id}}</div>"
link: function(scope, element, attrs, controller, transcludeFn) {
console.log("Appending transcluded content to " + scope.item.Id)
let e = transcludeFn();
element.append(e);
}
};
});
JSFiddle:https://jsfiddle.net/rmytw9cr/2/
利用NG-transclude属性は、それがより多くの情報のために...作業を開始する可能性があるhttp://teropa.info/blog/2015/06/09/transclusion.html – Ajay