2

I have the following list of students:

students = [{name:'Jordan', passed:true}, {name:'Kyle'},{name:'Jess'},
            {name:'Sam', passed:true}
           ]

I want to be able to, in an HTML template, get the length of the array where the student passed.

Normally I would do:

<div>
    {{students.length}}
</div>

However, I want something like this pseudocode...

<div>
    {{total length of students who passed}}
</div>

I want to make it so that if I have other buttons on the page that modify students so that when I change whether a student passes or not, the template will automatically reflect the correct number of students.

How can I do this?

HDJEMAI
  • 9,436
  • 46
  • 67
  • 93
Rolando
  • 58,640
  • 98
  • 266
  • 407

1 Answers1

5

You cannot do this in angular template, try to use a Pipe or invoking a method from your Component's class instead of doing it inside the template. I am suggesting to you Pipes.

In the template:

<div>
    {{ queryArray() }}
</div>

In the component:

queryArray() {
   return this.students.filter(c => c.passed).length;
}

For Pipe

In the html:

<div>{{students | myLengthFilter:'passed' }}</div>

In the pipe class:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'myLengthFilter'
})
export class MyLengthFilterPipe implements PipeTransform {

  transform(items: any[], field: string): any {
    if (!items || !field) {
      return items;
    }
    // filter items array, items which match and return true will be
    // kept, false will be filtered out
    return items.filter(c => c[field]).length;
  }
}
Shohel
  • 3,886
  • 4
  • 38
  • 75