Directive personnalisée avec templateUrl et ng-repeat

J'ai examiné ce problème pendant des heures, et finalement je l'ai reproduit sur plunker .

Voici mon problème:

Lorsqu'une directive personnalisée qui utilise la ressource externe en tant que modèle est combinée avec ng-repeat, la vue n'a pas fonctionné correctement pendant le changement de modèle.

Dans mon exemple, cliquer sur le lien remplacera le modèle, mais les anciennes données n'ont pas été nettoyées.

Et si template: 'stringTemplate' au lieu de templateUrl: 'urlToTemplate' , il fonctionne bien. Encore aucune idée si c'est un bug ou quelque chose …

Code partiel:

 angular.module('test', []) .run(function($rootScope) { $rootScope.topics = [{ content: 'Click here to change reply', replys: [{ content: 'Reply test...', }] }]; }) .directive('topic', function() { return { replace: true, restrict: 'E', templateUrl: 'topic.htm', link: function(scope) { scope.reply = function(input) { scope.topic.replys = [{ content: '"Reply test..." should be replaced, but it\'s not!' }]; } } }; }) .directive('reply', function() { return { replace: true, restrict: 'E', // template: '<div><div ng-bind="reply.content"></div></div>' //this works fine templateUrl: 'reply.htm' // same content }; }); 

J'ai fait des recherches et il semble que vous n'êtes pas seul dans cette question:

https://github.com/angular/angular.js/issues/2151

L'utilisateur ishw mentionne, comme une solution rapide:

"Pour ceux qui ne l'ont pas encore réalisé: c'est parce que votre ng-repeat est sur l'élément racine dans le modèle de votre directive. Enveloppez votre ng-repeat dans n'importe quel élément et ce sera bien".

J'ai essayé cela avec votre plunkr et ça semble fonctionner :

  <div> <div class="topic" ng-bind="topic.content" ng-click="reply()"></div> <div ng-repeat="reply in topic.replys"><reply></reply></div> </div>