【问题标题】:Angular 7 - Expand or Collapse Divs in a For loopAngular 7 - 在 For 循环中展开或折叠 Div
【发布时间】:2019-09-21 06:31:30
【问题描述】:

我在 For 循环中有多个卡片。在每张卡片中,我想使用链接或按钮显示和隐藏卡片内的内容。我没有唯一的 ID 来分配我想要切换的每个 div。有没有办法做到这一点?

以下代码仅展开或折叠第一张卡片中的内容,即使单击任何卡片中的任何“展开”或“折叠”按钮也是如此。

<div *ngFor="let result of results">
    <div class="clr-col-lg-12 clr-col-12">
        <div class="card">
            <div class="card-block">
                <div *ngIf="result?.name">
                    <h3 class="card-title">{{result.name}}</h3>
                </div>

                <div class="expandCollapse">
                    <button (click)="toggle($event)">
                        {{buttonName}}
                    </button>
                </div>
                <div class="expandCollapseContent" *ngIf="showRuleContent">
                    <div *ngIf="result?.cTag">
                        <h5>C Tag</h5>{{result.cTag}}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

组件

public showRuleContent:boolean = false;
public buttonName:any = 'Expand';

toggle($event) {
  this.showRuleContent = !this.showRuleContent;

  // CHANGE THE NAME OF THE BUTTON.
  if(this.showRuleContent)  
    this.buttonName = "Collapse";
  else
    this.buttonName = "Expand";
}

【问题讨论】:

标签: angular


【解决方案1】:

您可以使用一个数组来保存每个元素的可见状态,而不是单个变量。

模板

<div *ngFor="let result of results;let i = index">
    <div class="clr-col-lg-12 clr-col-12">
        <div class="card">
            <div class="card-block">
                <div *ngIf="result?.name">
                    <h3 class="card-title">{{result.name}}</h3>
                </div>

                <div class="expandCollapse">
                    <button (click)="toggle(i)">
                        {{hideRuleContent[i] ? 'Expand' : 'Collapse'}}
                    </button>
                </div>
                <div class="expandCollapseContent" *ngIf="!hideRuleContent[i]">
                    <div *ngIf="result?.cTag">
                        <h5>C Tag</h5>{{result.cTag}}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

组件

public hideRuleContent:boolean[] = [];
public buttonName:any = 'Expand';

toggle(index) {
  // toggle based on index
  this.hideRuleContent[index] = !this.hideRuleContent[index];
}

【讨论】:

    【解决方案2】:

    这是一种在列表中隐藏/显示项目的巧妙方法。您可以使用模板元素属性而不是将某些内容存储在数组中。

    注意它如何利用Angular's template variables (#ContentElement)。

    <ng-container *ngFor="let item of list">
      <div #ContentElement></div>
      <button (click)="toggle(ContentElement)">Toggle</button>
    </ng-container>
    
    // Maybe there are other ways to do this part, here is an example.
    // Idea here is to toggle a class.
    toggle(e: HTMLElement) {
      e.classList.toggle('hidden');
    }
    
    .hidden {
       display: none;
    }
    

    如果你不想隐藏,而是想从 DOM 中移除元素:

    close(e: HTMLElement) {
      e.remove();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2017-02-12
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2021-03-22
      • 2011-05-18
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多