Je ne peux pas comprendre pourquoi l'événement $ destroy n'est pas déclenché dans l'exemple suivant. Quelqu'un peut-il expliquer pourquoi il n'est pas déclenché et dans quels scénarios il le sera?
Voici le plunkr: http://plnkr.co/edit/3Fz50aNeuculWKJ22iAX?p=preview
angular.module('testMod', [])
.controller('testCtrl', function($scope){
$scope.removeElem = function(id) {
var elem = document.getElementById(id);
angular.element(elem).remove();
}
}).directive('testDir',[function() {
return {
scope:true,
link: function(scope) {
console.log('in directive');
scope.$on('$destroy', function(){
alert('destroyed');
})
}
}
}]);
<body ng-controller='testCtrl'>
<div testDir id='test'>I will be removed.</div>
<button ng-click='removeElem('test')'>remove</button>
</body>
Le problème est que vous écoutez le $destroy
événement sur le scope
, mais $destroy
est déclenché sur le element
.
De la source angular.js (je suis sûr que c'est documenté quelque part sur le site Web, mais je n'ai pas regardé):
$destroy
- AngularJS intercepte tous les apis de destruction DOM de jqLite/jQuery et déclenche cet événement sur tous les nœuds DOM en cours de suppression. Cela peut être utilisé pour nettoyer toutes les liaisons tierces à l'élément DOM avant sa suppression.
Votre directive devrait être (notez que j'ai ajouté scope
, element
et attrs
comme link
arguments): De plus, voici un plunker .
directive('testDir',[function() {
return {
scope:true,
link: function(scope,element,attrs) {
console.log('in directive');
element.on('$destroy', function(){
alert('destroyed');
})
}
};
}]);
Je suis perplexe sur la raison pour laquelle l'événement $ destroy n'est pas déclenché sur la méthode remove ().
Selon les documents, l'événement $ destroy est déclenché dans deux cas.
- Juste avant la destruction d'une lunette
- Juste avant la suppression d'un élément du DOM
Le but étant le "nettoyage". Vous pouvez écouter l'événement $ destroy et effectuer les nettoyages nécessaires avant de laisser une étendue ou un élément être détruit. ngIf, ngSwitch, ngRepeat et d'autres directives/méthodes intégrées utilisent l'événement $ destroy pour effectuer des nettoyages.
Un meilleur exemple serait la directive ngRepeat
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js
À la ligne 339, vous pouvez remarquer que l'événement $ destroy est déclenché. Vous pouvez écouter l'événement et effectuer n'importe quelle action juste avant qu'un élément ne soit supprimé de la liste utilisée par ngRepeat.
ngRepeat $ destroy Exemple Plunk - http://goo.gl/mkozCY