ngFor 仅单击一项

sir*_*rss 3 typescript ionic-framework angular

我的 ngFor 有问题:对于列表中的每个项目,我都有一个图像,通过单击我想仅显示该图像的详细信息。问题是,如果我单击图像,列表中所有项目的详细信息都会显示出来。

.html:

  <div class=" gif" *ngFor="let r of result">
    <img [src]="r.images.downsized.url" alt="image" (click)="getDetails()">
    <div class="v3" *ngIf="this.clicked">
      <ion-list>
        <ion-item>
          <ion-label>
            <h2>username: {{r?.username}}</h2>
            <h3>title: {{r?.title}}</h3>
            <p>import date:{{r?.import_datetime}}</p>
          </ion-label>
        </ion-item>
      </ion-list>
    </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

.ts:

  ngOnInit() {
    this.clicked = false
  }

  getDetails(): void {
    if (!this.clicked) {
      this.clicked = true
    }
    else {
      this.clicked = false
    }
  }
Run Code Online (Sandbox Code Playgroud)

And*_*riy 7

this在您的情况下是组件实例,因此this.clicked对于所有迭代项目来说都是全局的,这就是为什么所有项目都会显示出来。作为一种解决方案,您可以存储点击的索引:

<div class="gif" *ngFor="let r of result; let i = index">
  <img [src]="r.images.downsized.url" alt="image" (click)="clickedIndex = i">
  <div class="v3" *ngIf="clickedIndex === i">
    <ion-list>
      <ion-item>
        <ion-label>
          <h2>username: {{r?.username}}</h2>
          <h3>title: {{r?.title}}</h3>
          <p>import date:{{r?.import_datetime}}</p>
        </ion-label>
      </ion-item>
    </ion-list>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是将详细信息部分从循环移动到单独的组件中,该组件将接收 @Input 形式的详细信息

  • 感谢您接受我的答案,如果您想切换图像详细信息,请返回 `getDetails()` 函数并将当前索引发送到其中:`(click)="getDetails(i)"`,然后在该函数内检查是否索引与所选索引相同,如果是,则重置它,例如: `this.clickedIndex = this.clickedIndex === i ? 未定义:我` (2认同)