Sto usando questo file html semplice da riprodurre una perdita di memoria che ho trovato:Perdite di memoria direttive angolari?
<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js"></script>
<script>
var app = angular.module('testApp', []);
app.directive('directive1', function() {
return {
template: '<div directive2></div>',
scope: true
};
});
app.directive('directive2', function() {
function LeakObject() {}
function Foo() {
this.bar = function($scope) {
$scope.nottheredude;
};
}
return {
scope: true,
link: function($scope) {
$scope.memoryThatLeaks = new LeakObject();
new Foo().bar({});
new Foo().bar($scope);
}
};
});
</script>
</head>
<body ng-app="testApp">
<button ng-click="show = !show">Toggle</button>
<div ng-if="show">The directive <div directive1></div></div>
<div ng-if="!show">Nothing</div>
</body>
</html>
Ho una direttiva che crea solo un nuovo ambito e ha un altro direttiva nel suo modello.
L'altra direttiva fa qualcosa di un po 'strano (ho cercato di limitare il problema a ciò che sta causando la perdita e questo è il codice più breve che ho trovato che riproduce il problema).
Nel mio html principale, non faccio altro che passare da nulla a directive1
con un semplice ng-if
.
Si noti che directive2
crea anche un nuovo oggetto su $scope
chiamato LeakObject
. Prevedo che questo oggetto sia garbage collection quando riattivo il nulla div, dal momento che l'ambito della direttiva dovrebbe morire e tutti i dati su di esso con esso, ma secondo lo strumento di istantanea dell'heap di Chrome in modalità in incognito, non sta ottenendo non allocato.
Sto cercando di capire perché ciò accade, e perché, se commento la dichiarazione nel metodo bar
, non succede.
Procedura per riprodurre:
- aperto this file in incognito
- strumenti Aprire dev e vanno a profili
- Aggiornare la pagina
- Clicca
Toggle
due volte (in modo da ora si vedeNothing
sullo schermo ancora una volta - Acquisire un'istantanea dell'heap
- Scrivere 'leak' nel filtro in modo da puoi vedere che lo
LeakObject
esiste ancora quando non dovrebbe esistere davvero.
questo è come dovrebbe essere simile:
Qualcuno può aiutare/spiegare?
A quanto pare, questo non è un problema in Windows 8, Chrome 42 – Trevor
non possono riprodurre il problema su Ubuntu15/Chome – Bolza