Od jakiegoś czasu korzystam z AngularJS i od czasu do czasu zauważyłem potrzebę użycia $ timeout (Wydaje się, że zwykle jest to inicjalizacja wtyczki jQuery).
Ostatnio próbowałem uzyskać lepsze i bardziej dogłębne zrozumienie cyklu podsumowania i natknąłem się na funkcję $ evalAsync .
Wygląda na to, że ta funkcja daje podobne wyniki $timeout
, ale nie dajesz jej opóźnienia. Za każdym razem, gdy korzystałem $timeout
, było to z opóźnieniem 0, więc teraz zastanawiam się, czy powinienem był użyć $evalAsync
.
Czy są jakieś zasadnicze różnice między nimi? W jakich przypadkach używałbyś jednego nad drugim? Chciałbym się lepiej dowiedzieć, kiedy użyć którego.
źródło
W przypadku budowania złożonych aplikacji należy pamiętać, że wybór ma wpływ na wydajność. Chciałbym również uzupełnić odpowiedź Marka bardziej szczegółowymi informacjami technicznymi:
Limit czasu $ (oddzwanianie) będzie czekał na zakończenie bieżącego cyklu podsumowania (tj. aktualizację kątową wszystkich modeli i DOM), a następnie wykona wywołanie zwrotne - potencjalnie wpływające na model kątowy - a następnie uruchomi pełny
$apply
zakres $ root i przekieruje wszystko.Natomiast $ evalAsync (oddzwanianie) doda oddzwonienie do bieżącego lub następnego cyklu podsumowania. Co oznacza, że jeśli jesteś w cyklu podsumowania (na przykład w funkcji wywoływanej z jakiejś
ng-click
dyrektywy), to nie będzie na nic czekać, kod zostanie wykonany natychmiast. Jeśli znajdujesz się w wywołaniu asynchronicznym, na przykład asetTimeout
, zostanie uruchomiony nowy cykl podsumowania ($apply
).Dlatego pod względem wydajności zawsze lepiej jest wywoływać
$evalAsync
, chyba że ważne jest, aby widok był aktualny przed wykonaniem kodu, na przykład, jeśli potrzebujesz dostępu do niektórych atrybutów DOm, takich jak szerokość elementów i tym podobne.Jeśli chcesz uzyskać więcej informacji na temat rozróżnienia między $ timeout, $ evalAsync, $ digest, $ Apply, zapraszam do przeczytania mojej odpowiedzi na to drugie pytanie: https://stackoverflow.com/a/23102223/1501926
Przeczytaj także dokumentację :
źródło
x
bezpośrednio ze swojego zakresu, a nie z DOM, więc nie musisz na nic czekać. Ponadto powinieneś lepiej używaćng-style
css zamiast przestarzałejwidth
właściwości. Jeśli potrzebujesz dodatkowej pomocy, otwórz nowe pytanie na StackOverflow.