45

I need to give a class to a <tr> if a property of item has the same value as a property from an object in an array.

Here's the code I currently have:

<tr *ngFor="let item of closingDayGroupsList" [class.inactive]="definitionDetails.Groups.filter(i => i.AbsenceReservationGroupID === item.ID).length > 0">

however now I receive the error:

Bindings cannot contain assignments

I'm not sure if what I'm doing is bad practice, or if I'm just making syntax errors.

This is the only way I know to achieve what I want, but it's not working

Nicolas
  • 4,526
  • 17
  • 50
  • 87
  • 4
    Writing logic in Angular expressions is a bad practice. You should create a method in the view's component that will be able to tell whether the groups contain a given ID. The best would probably be if you could cache the results, because the method will be called very frequently. – Ján Halaša Mar 30 '17 at 12:35

2 Answers2

67

Its a bad practice to use expressions in angular bindings

Move the class expression into controller.

export class AppComponent {
    title = 'Groups';

    getClass(item): void {

      // add filter logic here
      return this.definitionDetails.Groups.filter(i => i.AbsenceReservationGroupID === item.ID).length > 0

    }
}

The tr will be something like,

<tr *ngFor="let item of closingDayGroupsList" [class.inactive]="getClass(item)">
Sravan
  • 18,467
  • 3
  • 30
  • 54
2

There is a little problem with that. Take as an example, that I want to stop showing the date to the user which is equal to 0000.00.00, so, by taking the inline expression binding I can find it right to:

 {{(appointment_date === "0000.00.00") ? ' ' : appointment_date}}