2012-12-12 5 views
14

Was ist der richtige Weg in AngularJS Bindungen zu trennen?AngularJS - Entfernen Sie Bindungen, um Speicherlecks zu vermeiden

Ich habe eine nicht-eckige Anwendung, die eine Komponente lädt, die angularjs verwendet, um Daten zu binden. Irgendwann möchte ich die Komponente zerstören und sicher sein, dass es keine Speicherlecks gibt. Wie erkenne ich angular, um alle Ereignis-Listener aus diesem Teil des DOM zu entfernen?

Würde $(node).remove() den Trick machen, oder tut eckig andere Dinge im Speicher, die aufgeräumt werden müssen ...? Alle anderen Tipps zur Vermeidung von mem-Lecks in eckigen würden geschätzt.

Antwort

10

Wenn Sie nur ein DOM-Element entfernen, das ein Scope mit etwa remove() hat, wird das Scope im Speicher nicht gelöscht. Sie können dies bestätigen, indem Sie ein Element entfernen und in Batarang suchen oder indem Sie den übergeordneten Bereich ermitteln und die untergeordneten Elemente untersuchen. Sie werden feststellen, dass der Bereich noch vorhanden ist. Sie möchten also auch $destroy() auf dem Scope selbst aufrufen.

More information about $destroy() can be found here.

EDIT: Eine Sache, die ich nicht sicher bin, ist, wenn es den Bereich vollständig löscht, oder trennt es einfach und lässt JavaScript GC kümmern sich um den Rest.

+0

Danke für die schnelle Antwort! –

+0

Die Dokumentation gibt an, dass es auch ein jQuery-Ereignis gibt, um den Bereich und das DOM-Element zu lösen, aber es gibt keinen beispielhaften Anwendungsfall. Ist es nur ein Fall, den Elementbereich zu finden, die Methode destroy aufzurufen und dann jquery remove() zu verwenden? Es erscheint seltsam, dass diese Funktionalität nicht als vollständige Funktion im Winkel existiert! – sidonaldson

+0

Wenn Sie window.leak einen Bereich zuweisen und dann einen Konsolenanmeldebereich festlegen. $ On ('destroy', ...) Sie werden sehen, dass destroy aufgerufen wird, aber Sie können dennoch vom Leck auf den Bereich zugreifen. –

Verwandte Themen