【问题标题】:Show specific Div inside ngFor在 ngFor 中显示特定的 Div
【发布时间】:2019-04-25 18:02:44
【问题描述】:

我有一堆卡片使用 ngFor 和用户信息。卡片内有一个按钮,可显示该特定用户的旅行信息。

我创建了一个初始状态为 display: none 的 div。我想过在点击时使用ngStyle 绑定display: block 属性,但问题是所有的div都被显示了,而不仅仅是我需要的那个。

关于如何做到这一点的任何建议?

html

<div class="col s12 m6 l4" *ngFor="let student of students; let i = index">
   <i class="material-icons" (click)="showBox()">access_alarm</i>

   <div class="travel-info" [ngStyle]="{'display': boxDisplay == true ? 'block' : 'none'}" >
      <app-travel-info ></app-travel-info>
   </div>
</div>

ts

boxDisplay = false;

showBox() {
    this.boxDisplay = true;
}

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    问题是您只为所有变量设置了一个变量。

    你会想把 showBox 重构成这样。

    TS

    this.boxDisplay = this.students.map(s => false);
    
    showBox(index) {
      this.boxDisplay[index] = true;
    }
    

    HTML

    <div class="col s12 m6 l4" *ngFor="let student of students; let i = index">
       <i class="material-icons" (click)="showBox(i)">access_alarm</i>
    
       <div class="travel-info" [ngStyle]="{'display': boxDisplay[i] == true ? 'block' : 'none'}" >
          <app-travel-info ></app-travel-info>
       </div>
    </div>
    

    如果是我,我会使用 ngIf 而不是 ngStyle。

    <div class="col s12 m6 l4" *ngFor="let student of students; let i = index">
       <i class="material-icons" (click)="showBox(i)">access_alarm</i>
    
       <div class="travel-info" *ngIf="boxDisplay[i]" >
          <app-travel-info ></app-travel-info>
       </div>
    </div>
    

    【讨论】:

      【解决方案2】:

      您需要有一个属性显示学生数组的每个元素,然后根据索引启用/禁用,

      <div class="col s12 m6 l4" *ngFor="let student of students; let i = index">
         <i class="material-icons" (click)="showBox(student)">access_alarm</i>
         <div class="travel-info" [ngStyle]"{'display': student.boxDisplay == true ? 'block' : 'none'}" >
            <app-travel-info ></app-travel-info>
         </div>
      </div>
      
      
      showBox(student:any) {
          student.boxDisplay = true;
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用@ViewChildren。我给你这个例子:

        您的 HTML:

        <div class="student-container" *ngFor="let s of students; let i = index">
          <span>Name: {{s.name}} - Index: {{i}}</span>
          <div class="student-box" #boxes>
            <span>Hey! I'm opened.</span>
            <span>My Secret Number is: {{s.secretNumber}}</span>
          </div>
          <button (click)="toggleBox(i)">Click Me!</button>
        </div>
        

        你的组件:

        import { Component, ViewChildren, QueryList, ElementRef } from "@angular/core";
        
        @Component({
          selector: "app-root",
          templateUrl: "./app.component.html",
          styleUrls: ["./app.component.css"]
        })
        export class AppComponent {
          @ViewChildren("boxes") private boxes: QueryList<ElementRef>;
        
          students = [
            { name: "Peter", secretNumber: "88" },
            { name: "Laura", secretNumber: "45" },
            { name: "Paul", secretNumber: "13" }
          ];
        
          toggleBox(index) {
            let nativeElement = this.boxes.toArray()[index].nativeElement;
            nativeElement.style.display =
              nativeElement.style.display === "none" || !nativeElement.style.display
                ? "block"
                : "none";
          }
        }
        

        你的 CSS:

        .student-container {
          background: lightblue;
          margin: 10px;
          padding: 10px;
        }
        
        .student-box {
          display: none;
        }
        

        https://codesandbox.io/s/zwqoxp583x

        【讨论】:

        • 嘿@Nicolas M 非常感谢你!效果很好!
        • @iconio 我猜你也可以在你的“学生对象”中添加一个布尔属性,比如“isOpen”,在你的 toggleBox 方法中使用索引在你的学生数组中搜索你的学生并设置isOpen 变量为真或假,视情况而定(可能类似于 student.isOpen = !student.isOpen)。然后,如果您的渲染列表太长,您可以避免使用 ViewChildren,只需将 *ngIf 与该 student.isOpen 变量一起使用,并删除#boxes 模板引用变量。希望对您有所帮助!
        猜你喜欢
        • 2019-10-06
        • 2017-07-01
        • 2019-09-08
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多