2012-07-26 14 views
22

? Soy bastante nuevo en angular, pero siento que esto es un poco loco.¿Es esto normal para el filtrado de AngularJs

Tengo múltiples colecciones que se muestran a través de ng-repeat en un ámbito de controlador. Hay un campo de entrada para cada lista para realizar una consulta simple. Estaba jugando con varios filtros en mi código y terminé colocando un console.log en mi función de filtro. Me di cuenta de que cada vez que se llamaba a mi función de filtro para una lista, se llamaba a todas las listas del alcance. Además, estaba llamando a la función de filtro dos veces cada vez. Entonces, con 3 colecciones, filtrar una de las listas llamaría a la función de filtro 6 veces.

Pensé que tal vez era solo mi filtro personalizado, así que lo probé con la función de filtro predeterminada. La misma historia Aquí está mi código:

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

Ir a la consola y ver por sí mismo:/

¿Qué estoy haciendo mal aquí? Esto parece algo tan simple pero está haciendo tanto trabajo.

Respuesta

25

Esto es normal, angularjs utiliza un enfoque de "comprobación sucia", por lo que debe llamar a todos los filtros para ver si existe algún cambio. Después de esto, detecta que tiene un cambio en una variable (la que escribió) y luego vuelve a ejecutar todos los filtros para detectar si tiene otros cambios.

Ver la primera respuesta de this pregunta

+1

Interesante. Eso explica por qué todos ellos son llamados. Ahora, ¿por qué todos se llaman dos veces cada vez que un cambio ha sucedido? –

+1

La primera llamada es de los observadores que están detectando el cambio. Como hay uno, deben volver a llamar para ver si hay cambios en las noticias porque un observador puede hacer cambios. Este proceso se repetirá hasta que no se encuentren cambios o el "bucle" alcance el número máximo de interacciones (creo que es 10). –

+0

¿Cómo evitar esto? hago una llamada JSON, pero puede ser llamada hasta 10 veces simplemente haciendo clic en cualquier lugar. – Gino

Cuestiones relacionadas