8

Nadal borykam się z tym samym problemem, filtry i funkcje wewnątrz ng-repeat są nazywane przez cały ten cholerny czas.Angular.js zmienia jeden element powtarzania ng powodując, że filtry wszystkich innych elementów działają

Przykład tutaj: http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview, za każdym razem, gdy zmienisz coś w jednym wierszu, filtr someFilter jest nazywany 1000 razy.

Podobno jest tak, ponieważ wszelkie zmiany w zakresie podrzędnym powodują powstawanie bąbelków do ich elementów nadrzędnych, co powoduje, że $ digest działa, powodując działanie wszystkich filtrów (https://stackoverflow.com/a/15936362/301596). Czy to prawda? Jak mogę temu zapobiec w moim konkretnym przypadku?

Jak sprawić, aby działał tylko na zmienionym elemencie?

W moim konkretnym przypadku zastosowania filtra nazywany jest nawet wtedy, gdy zmiana nie jest jeszcze na pozycje NG-repeat, to tak bez sensu i to jest rzeczywiście przyczyną problemów z wydajnością ..

// edit wyczyszczone wszystkie niepotrzebne rzeczy z plunker http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview

Odpowiedz

4

to jest po prostu jak brudne prace checking kątowej za. Jeśli masz tablicę 500 elementów i tablica się zmienia, filtr musi zostać ponownie zastosowany do całej tablicy. A teraz zastanawiasz się "dlaczego dwa razy"?

Od another answer:

Jest to normalne, angularjs wykorzystuje podejście „brudny-check”, więc trzeba zadzwonić wszystkie filtry, aby sprawdzić, czy istnieje jakiekolwiek zmiany. Po tym wykryje, że ma zmianę na jednej zmiennej (tej, którą wpisałeś), a następnie wykonuje ponownie wszystkie filtry, aby wykryć, czy ma inne zmiany.

A odpowiedź to Referencje: How does data binding work in AngularJS?

Edit: Jeśli jesteś naprawdę zauważyć spowolnienie (co nie jestem na starszego Core 2 Duo PC), prawdopodobnie istnieje wiele kreatywnych sposoby na obejście tego w zależności od tego, jaki będzie twój interfejs użytkownika.

  1. Można umieścić wiersz w trybie edycji, gdy użytkownik edytuje dane odizolować zmiany i synchronizować model z powrotem w górę, gdy użytkownik wychodzi z trybu edycji
  2. Mogłeś tylko aktualizacji modelu onblur zamiast onkeypress zastosowaniem dyrektywy, podobnie jak to: http://jsfiddle.net/langdonx/djtQR/1/
+0

Tak czytam co Misko napisał, ja też przeczytać, jak to nie będzie widoczne nawet z 2000 elementów, ale jest to bardzo widoczne. To poważne bóle w dupie, gdy wszystkie te filtry są wywoływane za każdym razem, gdy wpisuję cokolwiek na wejściu przed faktycznym powtórzeniem ng (http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview), szczególnie gdy mam wiele filtrów w każdym rzędzie powtórzenia ng. Sprawia, że ​​myślę, że lepiej zmodyfikować wartość, którą potrzebuję filtrować na init, a potem po zmianie. – foxx

+1

Wspieram Cię w tym, że jest to naprawdę bolesna cecha kątowa, ponieważ filtry służą tylko do transformacji danych, więc nie powinny oglądać każdej linii. –

+0

Więc jedynym rozwiązaniem są małe kolekcje? – Bart

Powiązane problemy