I have an ngFor creating rows in a table that is both filtered and paged.
<tr *ngFor="#d of data.results | filter:filterText | pagination:resultsPerPage:currentPage">
There is another element on the page that displays the number of records displayed. These elements are initially bound to the data.Results' length.
How do I get the length of the data that is displayed after the filter pipe has been applied so that I can display it correctly. None of the provided local variables in ngFor seem to account for this.
One way is to use template variables with
@ViewChildren()
So I found a workaround for this.
I created a pipe which takes an object reference and updates a property with the count currently passing through the pipe.
Then in your view link up a pagination component like so.
Once that count property is extracted from the pipe either to the current component or a child component you can do anything with it.
I found the simplest solution to be the following:
This solution still uses pure pipes, so there are no performance degradations. If you have multiple pipes that do filtering, the filterMetadata should be added as a parameter to all of them because angular stops calling the pipe sequence as soon as the a pipe returns an empty array, so you can't just add it to the first or last filtering pipe.
That is not exactly the purpose of the original question, but I was also looking for a way to display the count of items once that all pipes have been applied. By combining the index and last values provided by ngFor, I found this other solution :
You can get the count of the items by transforming the array within a pipe.
The idea is that the pipe would transform the array into another array where each element has an item property, and a parent property representing the filtered (or original) array:
Here is how it would be used:
I came across the same problem, although @bixelbits 's answer was approved, but I didn't find it ideal, specially for large data.
Instead of returning the original array in each element, I believe it's better just avoid
Pipes
for this problem, at least with the current Angular 2 implementation (rc4).A better solution would be using normal component's function to filter the data, something likes bellow:
Then, in the template:
Unless you really want to use
Pipes
, I would recommend you to avoid them in situations like the above example.