Tengo una matriz de datos que contiene muchos objetos (formato JSON). Se puede suponer lo siguiente como contenido de esta matriz:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Ahora, muestro estos detalles como:
<div ng-repeat="person in data | filter: query">
</div
Aquí, la consulta se modela en un campo de entrada en el que el usuario puede restringir los datos que se muestran.
Ahora, tengo otra ubicación en la que visualizo el recuento actual de personas / personas que se muestran, es decir Showing {{data.length}} Persons
Lo que quiero hacer es que cuando el usuario busca a una persona y los datos que se muestran se filtran en función de la consulta, Showing...persons
también cambia el valor de las personas que se muestran actualmente. Pero no está sucediendo. Siempre muestra el total de personas en los datos en lugar del filtrado: ¿cómo obtengo el recuento de datos filtrados?
fuente
$scope.filtered.length
.undefined
, probablemente porque al momento de registrarlo, la variable aún no está definida. Entonces, ¿cómo podría asegurarme de que el código en el controlador se ejecuta después de que se definió la variable y se aplicó el filtro en la vista?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. Así que tuve que usar la versión anterior a la 1.3:person in filtered = (data | filter: query) | limitTo: 5
Para completar, además de las respuestas anteriores (realizar el cálculo de personas visibles dentro del controlador) también puede realizar esos cálculos en su plantilla HTML como en el ejemplo a continuación.
Suponiendo que su lista de personas está en
data
variable y que filtra personas usando elquery
modelo, el siguiente código funcionará para usted:{{data.length}}
- imprime el número total de personas{{(data|filter:query).length}}
- imprime el número filtrado de personasTenga en cuenta que esta solución funciona bien si desea utilizar datos filtrados solo una vez en una página. Sin embargo, si usa datos filtrados más de una vez, por ejemplo, para presentar elementos y mostrar la longitud de la lista filtrada, sugeriría usar una expresión de alias (descrita a continuación) para AngularJS 1.3+ o la solución propuesta por @Wumms para la versión de AngularJS anterior a 1.3.
Nueva característica en Angular 1.3
Los creadores de AngularJS también notaron ese problema y en la versión 1.3 (beta 17) agregaron la expresión "alias" que almacenará los resultados intermedios del repetidor después de que se hayan aplicado los filtros, por ejemplo
La expresión de alias evitará un problema de ejecución de múltiples filtros.
Espero que le ayudará.
fuente
{{(data|filter:query|filter:query2).length}}
La forma más fácil si tienes
Longitud de datos filtrados
fuente
ngRepeat crea una copia de la matriz cuando aplica un filtro, por lo que no puede usar la matriz fuente para hacer referencia solo a los elementos filtrados.
En su caso, puede ser mejor aplicar el filtro dentro de su controlador utilizando el
$filter
servicio:Y luego usa la
filteredData
propiedad en su vista en su lugar. Aquí hay un Plunker en funcionamiento: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewfuente
{{filteredData.length}}
lugar dedata.length
. También entendí quemyInputModel
es el modelo asignado a la consulta de entrada que filtra los datos.val
sería el texto que se escribe en la entrada (básicamente consulta) pero cada vez que escribo, cambia. Pero que hayfilterFilter
aqui? Podría agregar que tengo mi propio CustomFilter creado (en el que puedo especificar qué clave del objeto considerar para el filtrado).ng-repeat="person in filteredData"
ya que no tiene sentido filtrarlo dos veces. Con el$filter
servicio, puede solicitar un filtro específico simplemente con el sufijo "Filtro", por ejemplo:dateFilter
,jsonFilter
, etc Si usted está utilizando su propio filtro personalizado, sólo tiene que utilizar uno que en lugar del genéricofilterFilter
.Desde AngularJS 1.3 puede usar alias:
y en alguna parte:
De documentos :
fuente
$scope.$watch
a este resultado con alias. ¿Algún consejo para$broadcast
laresults
variable con alias ?También es útil tener en cuenta que puede almacenar múltiples niveles de resultados agrupando filtros
aquí hay un violín de demostración
fuente
Aquí está el ejemplo trabajado Ver en Plunker
fuente
Puedes hacerlo de 2 maneras . En plantilla y en controlador . En la plantilla, puede establecer su matriz filtrada en otra variable y luego usarla como desee. Aquí está cómo hacerlo:
Si necesita ejemplos, vea los ejemplos / demostraciones de conteo filtrado de AngularJs
fuente