javascript - Hur man inaktiverar andra div:ar som kommer från en loop utom den som klickas


Jag har några li-taggar vars data kommer från en loop. När jag klickar på någon li-tagg blir den aktiv genom att bilden ändras och den kommer att lagras i localStorage så att den klickade taggen fortfarande är aktiv vid uppdatering. Här, när vi klickar, läggs ett aktivt objekt till i JSON med den klickade li-taggen och lagras i localStorage. Problemet är nu att när jag klickar igen på den klickade li-taggen eller utanför den, ändras den tidigare bilden, vilket inte borde hända. Andra li-taggar bör fortfarande vara inaktiverade förutom den klickade. Här är koden nedan https://stackblitz.com/edit/angular-skzgno?file=src%2Fapp%2Fapp.component.ts

app.component.html

<hello name="{{ name }}"></hello>
<p>
  Start editing to see some magic happen :)
</p>
<div>
    <pre>

  </pre>
    <ul>
<li *ngFor="let item of statusdata" (click)="toggleActive(item, !item.active)">
  <span>{{item.id}}</span>
  <span>{{item.name}}</span>
  <span>
    <img *ngIf="!item?.active || item?.active === false" src ="https://dummyimage.com/qvga" />
    <img *ngIf="item?.active === true" src ="https://dummyimage.com/300.png/09f/fff" />
  </span>
</li>
    </ul>
</div>

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  statusdata: any;

  ngOnInit() {
    this.statusdata = [
      { id: 1, name: "Angular 2" },
      { id: 2, name: "Angular 4" },
      { id: 3, name: "Angular 5" },
      { id: 4, name: "Angular 6" },
      { id: 5, name: "Angular 7" }
    ];

    this.statusdata.forEach(item => {
      this.getCacheItemStatus(item);
    });
  }

  toggleActive(item, activeStatus = true) {
    item.active = activeStatus;
    localStorage.setItem(`item:${item.id}`, JSON.stringify(item));
  }

  getCacheItemStatus(item) {
    const cachedItem = localStorage.getItem(`item:${item.id}`);
    if (cachedItem) {
      const parse = JSON.parse(cachedItem); // Parse cached version
      item.active = parse.active; // If the cached storage item is active
    }
  }
}

Svar #1

Det verkar för mig som att du bara behöver lägga till lite logik i din toggleActive-metod. Du skulle kunna kontrollera om några objekt är aktiva innan du bestämmer om du ska göra något åt klicket. Löser något som detta ditt problem?

toggleActive(item, activeStatus = true) {
   if(item.active || !this.statusdata.some(d => d.active)){
      item.active = activeStatus;
      localStorage.setItem(`item:${item.id}`, JSON.stringify(item));
   } 
}