Mam kod, który używa $ scope. $ Jednorazowo na init, a następnie w funkcji, więc kod jest wykonywany wiele razy. Jak mogę się odwiązać, jeśli najpierw, zanim ponownie go zwiążę. Próbowałem $ scope. $ Off, ale nie ma takiej funkcji, docs.angularjs.org/api nie mówi nic o $ na. Używam kątowego 1.0.6.
Odpowiedz
Jeśli nie wyrejestrujesz zdarzenia, dostaniesz wyciek pamięci, ponieważ funkcja, którą przekazujesz do $ on nie zostanie wyczyszczona (jak odniesienie do niej nadal istnieje). Co ważniejsze, wszelkie zmienne, które funkcjonują w swoim zakresie, również zostaną ujawnione. Spowoduje to, że twoja funkcja zostanie wywołana wiele razy, jeśli kontroler zostanie utworzony/zniszczony wiele razy w aplikacji. szczęście angularjs zapewnia kilka przydatnych metod, aby uniknąć wycieków pamięci i niechciane zachowanie:
- $ na metoda zwraca funkcję, która może być wywołana do wyrejestrować słuchacza zdarzeń.
- Za każdym razem, gdy luneta zostanie uprzątnięta w skali kątowej (to znaczy, że kontroler zostanie zniszczony) zostanie wywołane zdarzenie $ destroy w tym zakresie. Możesz zarejestrować się w zdarzeniu $ destroy $ scope i zadzwonić do niego cleanUpFunc.
zobacz dokumentację
Kod próbki:
angular.module("TestApp")
.controller("TestCtrl",function($scope,$rootScope){
var cleanUpFunc = $scope.$on('testListener', function() {
//write your listener here
});
//code for cleanup
$scope.$on('$destroy', function() {
cleanUpFunc();
};
})
$scope.$on
zwraca funkcję, do której możesz zadzwonić w celu wyrejestrowania.
Czy to gdzieś jest udokumentowane? – jcubic
Tak, to jest: https://docs.angularjs.org/api/ng/type/$rootScope.Scope – dude
jednak nie jest to wygodne, ponieważ jeśli chcesz wyrejestrować wydarzenie w innej funkcji, musisz przekazać wyrejestrowanie funkcja poprzez różne funkcje jako parametr – dude
- 1. Angular 1.5 Komponentowe wiązanie dwukierunkowe nie działa
- 2. Angular 2 - Interpolacja i wiązanie z asynchronicznym żądaniem http
- 3. Wiązanie ngModel z dynamiczną listą wyboru: Angular 2/Maszynopis
- 4. Jednokierunkowe wiązanie w angularjs 1.4
- 5. Jak Alter Wiązanie
- 6. Jak wybrać wiązanie WCF?
- 7. późne wiązanie w C
- 8. jak rozwiązać StringIndexOutOfBoundsException w android
- 9. Angular 2: jak utworzyć przyciski radiowe z enum i dodać wiązanie dwukierunkowe?
- 10. Wiązanie płótna w silverlight
- 11. wiązanie dwukierunkowe z elvis-operatorem
- 12. Wiązanie ComboBox.SelectedItem w Silverlight
- 13. Jak skonfigurować Angular cli + Angular Universal?
- 14. Jak ustawić wiązanie klawiszy CMD w Emacs?
- 15. Jak działa wiązanie asp.net Wewnętrznie
- 16. knockout.js wiązanie rekursywne
- 17. Jak rozwiązać Autofac InstancePerHttpRequest
- 18. Dwukierunkowe wiązanie w Angular 2 z NgModel i muting bound property?
- 19. Jak rozwiązać java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
- 20. Jak rozwiązać błąd MMUMapper?
- 21. Jak rozwiązać względne Uri?
- 22. Wiązanie PasswordBox
- 23. Jak rozwiązać nakładających instancja
- 24. Jak rozwiązać Microsoft.VisualStudio.ExtensionManager.MissingReferencesException
- 25. jQuery jak powiązać wiązanie danych?
- 26. Jak rozwiązać następujące nawroty?
- 27. Wiązanie modelu polimorficznego
- 28. Zmień wiązanie Proc w Ruby
- 29. wiązanie emberjs
- 30. Wiązanie wielu zdarzeń w jQuery
możliwy duplikat [Jak wypisać się z zdarzenie broadcast w angularjs. Jak usunąć funkcję zarejestrowaną przez $ on] (http://stackoverflow.com/questions/14898296/how-to-unsubscribe-to-a-broadcast-event-in-angularjs-how-to-remove-function-reg) – Julien