单击按钮时显示 More/Show Less ngFor 数据

Show More/Show Less ngFor data on button click

我在显示和隐藏 ngFor 数据时遇到问题。我想默认显示一条记录,当有人点击查看更多按钮时,将显示剩余记录。我不想自动关闭上一条记录。目前,当我打开另一个行程时,之前的行程内容将自动关闭。任何人,请帮助我?这是组件文件。

<div class="itineraryDay" *ngFor="let eventList of eventDailyItineraray; let i = index">
<div class="itineraryDay-header">
    <h5>Day {{i+1}}</h5>
    <p>{{eventList.tourevents[0]?.categoryName}}</p>
</div>
<div class="itineraryDay-detail">
    <div class="itinerary-cards">
        <mat-card class="mycard" *ngFor="let event of eventList.tourevents | slice:0:[selectedIndex === i ? max  : 1 ]; let j = index">
            <div class="day-activity d-flex">
                <div class="activity-img">
                    <img [src]="(event?.eventPic ? firstEventImage(event?.itemId,event?.eventPic):'./assets/media/icons/preview-item.svg')" />
                </div>
                <div class="activity-detail">
                    <div class="activity-detail-inner d-flex justify-content-between align-items-center">
                        <div class="activity-category d-flex">
                            <img src="{{categoryPic}}{{event?.categoryIcon}}" />
                            <span>{{event?.itemName}}</span>
                        </div>
                        <div class="activity-hours d-flex align-items-center justify-content-end">
                            <img src="./assets/media/icons/access_time-24px.svg" />
                            <span>{{durationCalculation(event?.duration)}} Hours</span>
                        </div>
                    </div>
                    <p>{{event?.description}}</p>
                </div>
            </div>
        </mat-card>
    </div>
    <div class="see-more">
        <div class="icon-inner">
            <p (click)="toggle(i, $event)" class="seeMore">See More</p>
            <div class="more-icon" (click)="toggle(i, $event)" [ngClass]="{'active': selectedIndex === i}" >
                <i class="flaticon-eye"></i>
            </div>
        </div>
    </div>
</div>

这里是ts文件中的点击函数

toggle(index, event){

this.max = this.eventDailyItineraray[index].tourevents.length;

if(this.selectedIndex === index){
  this.selectedIndex = -1;
  event.currentTarget.parentElement.children[0].innerText = 'See More';
}else{
  this.selectedIndex = index;
  event.currentTarget.parentElement.children[0].innerText = 'See Less';
} } 

你可以试试把'trackby'的概念放在这里。它会跟踪之前的变化,其他变化会顺利添加

<...*ngFor="let item of items; trackBy:trackByIdentity">

在您的 .ts 文件中

trackByIdentity(index, item){
     return item.<attribute_which_is_unique>; 
  }

我在这种情况下所做的(这可能是一个“廉价”的解决方案,但到目前为止我想不出更好的主意)是在你的可迭代对象中的每个对象中添加一个值,表明是否项目应该有一个活动的 class 或没有。在您的情况下,当您获取 youeventList.tourevents 时,您可以对其进行映射并向其中的每个对象添加类似 (isActive = false) 的内容,然后将该值绑定到 ngFor 中每个项目的 class循环。

因此,当您单击切换按钮时,您传递了 ngFor 项目的索引,并修改了数组中的该值 - 它应该附加或删除相应项目的活动 class 名称,并且不会对 ngFor 循环中的其余项目做任何事情。我希望它很清楚,如果需要,我可以用示例代码更新我的答案。

你想要管理一个项目列表,所以你需要一个数组——而不是单个变量。于是定义了一个数组

more:boolean[]=[]

此外,要更改 html 中的文本,不要使用像 event.currentTarget.parentElement.children[0].innerText = 'See More' 那样“奇怪”的东西,更好的是“angular 方式”

<p (click)="more[i]==!more[i]" class="seeMore">
    {{more[i]?'See Less':'See more'}}
</p>

并替换你的

`selectedIndex === i` by `more[i]`