Zarejestrowałem mojego słuchacza na zdarzenie emisji $ za pomocą funkcji $ on
$scope.$on("onViewUpdated", this.callMe);
i chcę wyrejestrować tego odbiornika na podstawie określonej reguły biznesowej. Ale moim problemem jest to, że po zarejestrowaniu nie mogę go wyrejestrować.
Czy w AngularJS jest jakaś metoda wyrejestrowania konkretnego odbiornika? Metodą taką jak $ przy tym wyrejestrowaniu tego zdarzenia może być $ off. Opierając się na logice biznesowej, mogę powiedzieć
$scope.$off("onViewUpdated", this.callMe);
i ta funkcja przestaje być wywoływana, gdy ktoś transmituje zdarzenie „onViewUpdated”.
Dzięki
EDYCJA : Chcę wyrejestrować słuchacza z innej funkcji. Nie jest to funkcja, w której ją rejestruję.
Odpowiedzi:
Musisz zapisać zwróconą funkcję i wywołać ją, aby anulować subskrypcję zdarzenia.
Można to znaleźć w kodzie źródłowym :) przynajmniej w wersji 1.0.4. Po prostu opublikuję pełny kod, ponieważ jest krótki
Zobacz także dokumenty .
źródło
Patrząc na większość odpowiedzi, wydają się one zbyt skomplikowane. Angular ma wbudowane mechanizmy do wyrejestrowania.
Użyj funkcji wyrejestrowania zwróconej przez
$on
:źródło
$scope.$on
nie trzeba ręcznie rejestrować$destroy
. Lepszym przykładem byłoby użycie$rootScope.$on
.Ten kod działa dla mnie:
źródło
EDYCJA: Prawidłowym sposobem na to jest odpowiedź @ LiviuT!
Zawsze możesz rozszerzyć zakres Angulara, aby umożliwić Ci usunięcie takich detektorów:
A oto jak to by działało:
A oto kawałek tego w akcji
źródło
Po debugowaniu kodu stworzyłem własną funkcję, podobnie jak odpowiedź „blesh”. Tak właśnie zrobiłem
więc dołączając moją funkcję do $ rootscope, jest ona teraz dostępna dla wszystkich moich kontrolerów.
i robię w moim kodzie
Dzięki
EDYCJA: Sposób AngularJS na to jest w odpowiedzi @ LiviuT! Ale jeśli chcesz wyrejestrować nasłuchiwanie w innym zakresie i jednocześnie nie chcesz tworzyć lokalnych zmiennych, aby zachować odwołania do funkcji wyrejestrowania. To możliwe rozwiązanie.
źródło
Odpowiedź @ LiviuT jest niesamowita, ale wydaje się, że wielu ludzi zastanawia się, jak ponownie uzyskać dostęp do funkcji usuwania funkcji obsługi z innego zakresu lub funkcji $, jeśli chcesz ją zniszczyć z miejsca innego niż to, w którym została utworzona. @ Рустем Мусабеков odpowiedź działa po prostu świetnie, ale nie jest bardzo idiomatyczna. (I opiera się na czymś, co powinno być prywatnym szczegółem implementacji, który może się zmienić w dowolnym momencie.) Od tego momentu staje się to bardziej skomplikowane ...
Myślę, że najłatwiejszą odpowiedzią jest po prostu przeniesienie odwołania do funkcji usuwania (
offCallMeFn
w jego przykładzie) w samym module obsługi, a następnie wywołanie jej na podstawie pewnych warunków; być może argument, który dołączasz do wydarzenia, które emitujesz lub emitujesz. W ten sposób handlowcy mogą się zburzyć, kiedy tylko chcesz, gdziekolwiek chcesz, niosąc nasiona własnego zniszczenia. Tak jak:Dwie myśli:
selfDestruct
jak tylko zakończy się samobójcza misja.źródło
Zarejestruj hak, aby wypisać się ze słuchaczy, gdy składnik zostanie usunięty:
źródło
W przypadku konieczności wielokrotnego włączania i wyłączania nasłuchiwania można utworzyć funkcję z
boolean
parametremźródło
Sam $ $ zwraca funkcję do wyrejestrowania
możesz wywołać funkcję unregister (), aby wyrejestrować tego odbiornika
źródło
Jednym ze sposobów jest po prostu zniszczenie słuchacza, gdy skończysz.
źródło