Mam tablicę danych, która zawiera wiele obiektów (format JSON). Jako zawartość tej tablicy można założyć:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Teraz wyświetlam te szczegóły jako:
<div ng-repeat="person in data | filter: query">
</div
Tutaj zapytanie jest modelowane do pola wejściowego, w którym użytkownik może ograniczyć wyświetlane dane.
Teraz mam inną lokalizację, w której wyświetlam bieżącą liczbę wyświetlanych osób / osób, tj Showing {{data.length}} Persons
Chcę, aby gdy użytkownik szukał osoby, a wyświetlane dane były filtrowane na podstawie zapytania, Showing...persons
zmieniałem również wartość wyświetlanych osób. Ale tak się nie dzieje. Zawsze wyświetla całkowitą liczbę osób w danych zamiast filtrowanej - jak uzyskać liczbę odfiltrowanych danych?
źródło
$scope.filtered.length
.undefined
, prawdopodobnie dlatego, że w momencie logowania zmienna nie jest jeszcze zdefiniowana. Jak więc upewnić się, że kod w kontrolerze jest uruchamiany po zdefiniowaniu zmiennej i zastosowaniu filtra w widoku?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. Musiałem więc użyć wcześniejszej wersji 1.3:person in filtered = (data | filter: query) | limitTo: 5
Dla kompletności, oprócz poprzednich odpowiedzi (wykonaj obliczenia widocznych osób wewnątrz kontrolera), możesz również wykonać te obliczenia w szablonie HTML, jak w poniższym przykładzie.
Zakładając, że twoja lista osób jest
data
zmienna, a ty filtrujesz ludzi za pomocąquery
modelu, następujący kod będzie dla ciebie działał:{{data.length}}
- drukuje całkowitą liczbę osób{{(data|filter:query).length}}
- drukuje przefiltrowaną liczbę osóbPamiętaj, że to rozwiązanie działa dobrze, jeśli chcesz użyć przefiltrowanych danych tylko raz na stronie. Jeśli jednak użyjesz przefiltrowanych danych więcej niż raz, np. Do prezentacji elementów i wyświetlenia długości przefiltrowanej listy, sugerowałbym użycie wyrażenia aliasowego (opisanego poniżej) dla AngularJS 1.3+ lub rozwiązania zaproponowanego przez @Wumms dla AngularJS w wersji wcześniejszej niż 1.3.
Nowa funkcja w Angular 1.3
Twórcy AngularJS również zauważyli ten problem, aw wersji 1.3 (beta 17) dodali wyrażenie „alias”, które będzie przechowywać pośrednie wyniki przemiennika po zastosowaniu filtrów, np.
Wyrażenie alias będzie zapobiec wielu kwestii wykonania filtra.
Mam nadzieję, że to pomoże.
źródło
{{(data|filter:query|filter:query2).length}}
Najłatwiejszy sposób, jeśli masz
Filtrowana długość danych
źródło
ngRepeat tworzy kopię tablicy po zastosowaniu filtru, więc nie można używać tablicy źródłowej do odwoływania się tylko do przefiltrowanych elementów.
W twoim przypadku może być lepiej zastosować filtr wewnątrz kontrolera za pomocą
$filter
usługi:I
filteredData
zamiast tego używasz właściwości w swoim widoku. Oto działający Plunker: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewźródło
{{filteredData.length}}
zamiastdata.length
. Zrozumiałem również, żemyInputModel
jest to model odwzorowany na zapytanie wejściowe, które filtruje dane.val
byłby tekst wpisany w danych wejściowych (w zasadzie zapytanie), ale za każdym razem, gdy piszę, zmienia się. Ale cofilterFilter
tu jest ? Mogę dodać, że utworzyłem własny filtr niestandardowy (w którym mogę określić klucz obiektu, który należy rozważyć do filtrowania).ng-repeat="person in filteredData"
ponieważ nie ma sensu filtrować go dwukrotnie. Z$filter
usługi można poprosić o określonej przez filtr tylko przyrostka go z „Filtr”, np:dateFilter
,jsonFilter
, itd. Jeśli używasz swój własny filtr, wystarczy użyć tamten zamiast rodzajowyfilterFilter
.Od AngularJS 1.3 możesz używać aliasów:
i gdzieś:
Z dokumentów :
źródło
$scope.$watch
do tego aliasu wyniku. Jakieś wskazówki dotyczące$broadcast
wprowadzaniaresults
zmiennej aliasu ?Warto również zauważyć, że można przechowywać wiele poziomów wyników, grupując filtry
oto skrzypka demonstracyjna
źródło
Oto działający przykład Zobacz na Plunker
źródło
Możesz to zrobić na 2 sposoby . W szablonie iw kontrolerze . W szablonie możesz ustawić filtrowaną tablicę na inną zmienną, a następnie użyć jej tak, jak chcesz. Oto jak to zrobić:
Jeśli potrzebujesz przykładów, zapoznaj się z filtrowanymi przykładami / pokazami AngularJs
źródło