แสดงเพิ่มเติม/แสดงน้อยลง ngFor ข้อมูลเมื่อคลิกปุ่ม

ฉันได้รับปัญหาขณะแสดงและซ่อนข้อมูล 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';
} } 

ภาพหน้าจอ


person Faizi    schedule 08.10.2020    source แหล่งที่มา


คำตอบ (3)


คุณต้องการจัดการรายการ ดังนั้นคุณต้องมีอาร์เรย์ ไม่ใช่ตัวแปรตัวเดียว ดังนั้นกำหนดอาร์เรย์

more:boolean[]=[]

นอกจากนี้หากต้องการเปลี่ยนข้อความใน html อย่าใช้สิ่งที่แปลกประหลาดอย่าง event.currentTarget.parentElement.children[0].innerText = 'See More' วิธีเชิงมุมที่ดีกว่า

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

และแทนที่ของคุณ

`selectedIndex === i` by `more[i]`
person Eliseo    schedule 09.10.2020
comment
ขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันต้องการเปลี่ยนค่าของส่วนอาร์เรย์ (รายการ) ด้วยเมื่อคลิกปุ่มดูเพิ่มเติม โดยค่าเริ่มต้นค่าสไลซ์คือ 0 และเมื่อคลิกปุ่มดูเพิ่มเติม เราจำเป็นต้องแสดงรายการที่เหลือ @เอลิเซโอ - person Faizi; 12.10.2020

คุณสามารถลองใส่แนวคิด 'trackby' ที่นี่ จะติดตามการเปลี่ยนแปลงก่อนหน้านี้และการเปลี่ยนแปลงอื่น ๆ จะถูกเพิ่มอย่างราบรื่น

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

และภายในไฟล์ .ts ของคุณ

trackByIdentity(index, item){
     return item.<attribute_which_is_unique>; 
  }
person PushpikaWan    schedule 08.10.2020

สิ่งที่ฉันทำในกรณีเช่นนี้ (และอาจเป็นวิธีแก้ปัญหาที่ถูก แต่จนถึงตอนนี้ฉันยังไม่มีแนวคิดที่ดีกว่านี้) คือการเพิ่มมูลค่าลงในแต่ละอ็อบเจ็กต์ภายใน iterable ของคุณ โดยระบุว่าไอเท็มนั้นควรมีคลาสที่แอ็คทีฟหรือ ไม่. ในกรณีของคุณ เมื่อคุณดึงข้อมูล youeventList.tourevents คุณสามารถแมปมันและเพิ่มบางอย่างเช่น (isActive = false) ให้กับแต่ละอ็อบเจ็กต์ที่อยู่ภายใน จากนั้นผูกค่านั้นกับคลาสของแต่ละรายการในลูป ngFor ของคุณ

ดังนั้นเมื่อคุณคลิกที่ปุ่มสลับ คุณจะส่งดัชนีของรายการ ngFor และแก้ไขค่านั้นในอาร์เรย์ของคุณ - ซึ่งควรต่อท้ายหรือลบชื่อคลาสที่ใช้งานอยู่สำหรับรายการที่เหมาะสมของคุณ และจะไม่ทำอะไรกับรายการที่เหลือ ในลูป ngFor ของคุณ ฉันหวังว่าจะชัดเจน ฉันอาจอัปเดตคำตอบด้วยโค้ดตัวอย่างหากจำเป็น

person IamFlok    schedule 08.10.2020
comment
หากเราใช้วิธีนี้โดยการเพิ่ม/ลบคลาส จะส่งผลต่อความเร็วของหน้า ถ้าข้อมูลมีขนาดใหญ่ @IamFlok - person Faizi; 08.10.2020
comment
ในกรณีที่มีข้อมูลขนาดใหญ่ คุณไม่ควรเพิ่มประสิทธิภาพโดยใช้ inifnite-scroll หรืออะไรที่คล้ายกันใช่ไหม ฉันยังสงสัยด้วยว่ามีวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่ @ไฟซี - person IamFlok; 08.10.2020
comment
คุณเคยใช้วิธี trackBy มาก่อนหรือไม่? ฉันไม่สามารถบรรลุสิ่งนี้ได้โดย trackBy @IamFlok - person Faizi; 08.10.2020
comment
ในกรณีที่ข้อมูลมีขนาดใหญ่ จะมีรูปภาพพร้อมแต่ละบันทึกซึ่งจะเพิ่มเวลาในการโหลดเพจ@IamFlok - person Faizi; 09.10.2020
comment
คุณช่วยส่งโค้ดตัวอย่างที่คุณพูดถึงมาให้ฉันหน่อยได้ไหม @IamFlok - person Faizi; 09.10.2020