2012-07-26 20 views
22

Jestem całkiem nowy dla kanciastych, ale czuję, że to trochę szalone.Czy to normalne dla filtrowania AngularJs?

Mam wielokrotne kolekcje wyświetlane przez ng-repeat w jednym zasięgu kontrolera. Istnieje pole wprowadzania dla każdej listy, aby wykonać proste zapytanie. Grałem z różnymi filtrami w moim kodzie i skończyłem umieszczając plik console.log w mojej funkcji filtrowania. Zdałem sobie sprawę, że za każdym razem, gdy moja funkcja filtrowania była wywoływana dla jednej listy, była ona wywoływana dla wszystkich list w zakresie. Ponadto wywoływał funkcję filtra dwukrotnie za każdym razem. Tak więc przy 3 kolekcjach, filtrowanie jednej z list wywołuje funkcję filtrowania 6 razy.

Pomyślałem, że może to był mój filtr, więc wypróbowałem go na domyślnej funkcji filtra. Ta sama historia. Oto mój kod:

https://dl.dropbox.com/u/905197/angular-filter-test.html

Idź do konsoli i zobaczyć na własne oczy:/

Co robię źle tutaj? Wydaje się to być tak prostą rzeczą, ale robi tak wiele pracy.

Odpowiedz

25

Jest to normalne, angularjs używa metody "brudnego sprawdzenia", więc musi wywołać wszystkie filtry, aby sprawdzić, czy istnieją jakiekolwiek zmiany. Po tym wykryciu wykryje zmianę jednej zmiennej (tej, którą wpisałeś), a następnie ponownie wykonuje wszystkie filtry, aby wykryć, czy ma inne zmiany.

Zobacz pierwsze pytanie odpowiedź this

+1

Interesujące. To wyjaśnia, dlaczego wszyscy zostali wezwani. Dlaczego wszyscy zostali wezwani dwa razy za każdym razem, gdy nastąpiła zmiana? –

+1

Pierwsze połączenie pochodzi od obserwatorów, którzy wykrywają zmianę. Ponieważ jest jeden, muszą być ponownie wywoływane, aby sprawdzić, czy są jakieś zmiany, ponieważ obserwator może wprowadzać zmiany. Ten proces zostanie powtórzony, dopóki nie zostaną znalezione żadne zmiany lub "pętla" osiągnie maksymalną liczbę interakcji (myślę, że to 10). –

+0

Jak tego uniknąć? wykonuję połączenie json, ale można je wywołać do 10 razy, klikając w dowolnym miejscu. – Gino

Powiązane problemy