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...personstambié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: 5Para 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
datavariable y que filtra personas usando elquerymodelo, 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
$filterservicio:Y luego usa la
filteredDatapropiedad 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í quemyInputModeles el modelo asignado a la consulta de entrada que filtra los datos.valsería el texto que se escribe en la entrada (básicamente consulta) pero cada vez que escribo, cambia. Pero que hayfilterFilteraqui? 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$filterservicio, 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.$watcha este resultado con alias. ¿Algún consejo para$broadcastlaresultsvariable 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