angular2 toggle icons inside ngFor

10,584

If I understand you right you can have just one <i> on the page instead of having two:

template:

<div *ngFor="let day of daysInAWeek; let i = index">
    <div>{{day}}</div>
    <div>
        <i class="fa" [ngClass]="toggle[i] ? 'fa-plus': 'fa-minus'" aria-hidden="true"></i>
    </div>
    <div class="details">Today is {{day}}</div>
    <button (click)="toggle[i] = !toggle[i]">Toggle</button>
</div>

ts:

daysInAWeek: string[] = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; 
toggle = {};

So you can toggle just toggle classes on that element to be fa-plus or fa-minus

You can put (click)="toggle[i] = !toggle[i] on any html element inside your *ngFor temlpate so it will trigger the toggle on click for related <i> element.

Share:
10,584
Pratap A.K
Author by

Pratap A.K

Updated on July 08, 2022

Comments

  • Pratap A.K
    Pratap A.K almost 2 years

    Can some one please let me know how to toggle icons while doing ngFor?

    Problem Statement: I'm using *ngFor to loop through an array and display category names. On click of day I need to open an accordian and show category details (I can do this). Once accordian opens I need to replace fa-plus icon with fa-minus and vice-versa and I need to do this only for clicked day.

    How can I achieve this effectively?

    this.categoryList = [
    {type: 'space', name: 'Space'},
    {type: 'energy', name: 'Energy'},
    {type: 'comfort', name: 'Comfort'},
    {type: 'maintenance', name: 'Maintenance'},
    {type: 'reporting', name: 'Reporting'}
    ];
    

    HTML

    <div class="{{category.type}}" *ngFor="let category of categoryList">
        <div data-toggle="collapse" [attr.href]="'#'+'category-'+category.type">
        <div class="title {{category.name}}">{{category.name}}</div>
        <div>
            <i class="fa fa-plus"></i> //needs to toggle between plus and minus
                    <i class="fa fa-minus"></i> //needs to toggle between plus and minus
        </div>
        </div>
    
        <div class="collapse" id="category-{{category.type}}">
            //details
        </div>
    </div>
    
  • Pratap A.K
    Pratap A.K about 7 years
    I tried your solution but but its toggling icons for all the categories. Please take a look at attached screen shots. thanks
  • angularrocks.com
    angularrocks.com about 7 years
    yeah, you right. I modified the code so now it should work just for each item using an index