2014-05-09 17 views
32

Chcę wykonać funkcję wewnątrz dyrektywy, gdy istnieje zmiana stanu w zakresie nadrzędnym.

Oczywistym sposobem na osiągnięcie tego jest użycie transmisji wydarzeń ($broadcast) i słuchaczy ($on).

Ciekaw jestem, czy używanie opcji $ watch jest alternatywą dla transmisji wydarzeń. Jeśli tak, to jak porównują się te dwie?

O ile rozumiem, wyrażenie, które ma być oglądane, jest oceniane w każdym cyklu podsumowania $. Czy więc wydarzenia są bardziej wydajne niż oglądanie?

+0

możliwy duplikat [Co to jest "tańszy" pod względem wydajności transmisji $ lub zegarka $] (http://stackoverflow.com/questions/19616520/what-is-cheaper-performance-wise-broadcast-orwatch) – Blackhole

Odpowiedz

31

Funkcja $watch służy do oglądania zmiennych w zakresie. Dziedziczenie dziedzin pozwala również na obserwowanie zmiennych w zakresie rodzica, więc jest to zdecydowanie najlepszy sposób na wykorzystanie przypadku. Jak poprawnie powiedziałeś, $on jest używany do oglądania zdarzeń, które możesz $broadcast dla zakresów potomnych lub $emit dla zakresów nadrzędnych. Zapewnia to o wiele większą kontrolę, ale może powodować więcej błędów podczas kodowania, ponieważ można uzyskać aktualizację zmiennej zakresu od punktu, który nie jest monitorowany i zapomnieć powiadomić słuchaczy.

Możesz nadal używać zdarzeń, gdy nie dziedziczysz zmiennych zasięgu. Należy jednak uważać, aby nie zanieczyścić dużego zakresu, ponieważ może to być opcja usług, ponieważ od razu widać, czy jest wstrzykiwany, czy nie.

Ponieważ dyrektywa dostaje zakres, w którym jest włączony (lub dziedziczy po nim), powiedziałbym, że $watch jest tu znacznie czystszą opcją.

Jeśli chcesz mieć izolowany zasięg na dyrektywie, możesz przekazywać argumenty jako atrybuty i $observe je.

+0

To bardzo jasne wytłumaczenie, ale nie rozumiałem, o co tu chodzi- "Ale bądź ostrożny, aby nie zanieczyścić dużego zakresu", czy chcesz nie zanieczyszczać zbyt wieloma wydarzeniami? –

+1

Podczas komunikacji między całkowicie niezależnymi kontrolerami/dyrektywami za pośrednictwem zdarzeń, oba muszą mieć wspólny zakres nadrzędny, nad którym transmitujesz. W większości przypadków będzie to $ rootScope. W dużej aplikacji kończy się wiele zdarzeń na korzeniach, a stracisz kontrolę nad tym, który komponent zasubskrybuje dane zdarzenie, podczas gdy przy wtrysku zależności (i usługach komunikacyjnych) możesz go zobaczyć natychmiast i jest to znacznie łatwiejsze. test/debugowanie. –

+3

Tak długo, jak utrzymujesz ścisłą kontrolę, za pośrednictwem Usług, swojego wydarzenia transmisyjnego - co powinno być najlepszą praktyką - twierdziłbym, że oszczędności wydajności nad zegarkami przewyższają wszystko inne. Przynajmniej na stronach, na których znajduje się niebanalna ilość zegarków $ $ (jawna lub niejawna). Przynajmniej powinieneś wykonać liczenie zegarków, aby zobaczyć, w którym obozie się znajdujesz. – user1821052