Estoy usando una directiva ng-repeat con filtro así:
ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4"
y puedo ver los resultados renderizados bien; ahora quiero ejecutar algo de lógica en ese resultado en mi controlador. La pregunta es ¿cómo puedo obtener la referencia de los elementos de resultado?
Actualizar:
Solo para aclarar: estoy tratando de crear un autocompletado, tengo esta entrada:
<input id="queryInput" ng-model="query" type="text" size="30" placeholder="Enter query">
y luego los resultados filtrados:
<ul>
<li ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4">{{item.name}}</li>
</ul>
ahora quiero navegar por el resultado y seleccionar uno de los elementos.
javascript
angularjs
filter
angularjs-ng-repeat
Shlomi Schwartz
fuente
fuente
filteredItems
siempre obtengo los datos un filtro más tarde. No es el resultado del filtro recién cambiado, sino el del cambio anterior. ¿Algunas ideas?Aquí está la versión de filtro de la solución de Andy Joslin.
Actualización: ROMPER EL CAMBIO. A partir de la versión 1.3.0-beta.19 ( este commit ) los filtros no tienen contexto y
this
estarán vinculados al alcance global. Puede pasar el contexto como argumento o usar la nueva sintaxis de alias en ngRepeat , 1.3.0-beta.17 +.Entonces en tu opinión
Lo que te da acceso a
$scope.filteredItems
.fuente
$parse
es el compilador de expresiones de Angular . Por ejemplo, tomará la cadena 'some.object.property' y devolverá una función que le permite establecer u obtener un valor en dicha ruta para un determinado contexto. Lo estoy usando para establecer resultados de filtro en el $ alcance aquí, específicamente. Espero que esto responda tu pregunta.Pruebe algo como esto, el problema con ng-repeat es que crea un ámbito secundario debido a que no puede acceder
del controlador
fuente
Actualizar:
Incluso después de 1.3.0. si quieres ponerlo en el alcance del controlador o el padre no se puede hacer eso con tan sintaxis. Por ejemplo si tengo el siguiente código:
Lo anterior no funcionará. La forma de evitarlo es usando $ parent como sigue :
fuente
console.log labelResults
siempre obtengo el filtro de datos uno más tarde. No es el resultado del filtro recién cambiado, sino el del cambio anterior. ¿No tuviste este problema?Se me ocurrió una versión algo mejor de la solución de Andy. En su solución, ng-repeat coloca un reloj en la expresión que contiene la asignación. Cada ciclo de resumen evaluará esa expresión y asignará el resultado a la variable de alcance.
El problema con esta solución es que puede encontrarse con problemas de asignación si está en un ámbito secundario. Esta es la misma razón por la que debería tener un punto en ng-model .
La otra cosa que no me gusta de esta solución es que oculta la definición de la matriz filtrada en algún lugar del marcado de la vista. Si se usa en varios lugares en su vista o en su controlador, puede ser confuso.
Una solución más simple es colocar un reloj en su controlador en una función que realice la asignación:
Esta función se evaluará durante cada ciclo de digestión, por lo que el rendimiento debe ser comparable con la solución de Andy. También puede agregar cualquier número de tareas en la función para mantenerlas todas en un solo lugar en lugar de estar dispersas por la vista.
En la vista, simplemente usaría la lista filtrada directamente:
Aquí hay un violín donde esto se muestra en un escenario más complicado.
fuente
Mira esta respuesta:
Seleccionar y acceder a elementos en ng-repeat
fuente