Angular 2 แสดงและซ่อนองค์ประกอบ


174

ฉันมีปัญหาในการซ่อนและแสดงองค์ประกอบโดยขึ้นอยู่กับตัวแปรบูลีนใน Angular 2

นี่คือรหัสสำหรับ div ที่จะแสดงและซ่อน:

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>

ตัวแปรคือ "แก้ไข" และเก็บไว้ในองค์ประกอบของฉัน:

export class AppComponent implements OnInit{

  (...)
  public edited = false;
  (...)
  saveTodos(): void {
   //show box msg
   this.edited = true;
   //wait 3 Seconds and hide
   setTimeout(function() {
       this.edited = false;
       console.log(this.edited);
   }, 3000);
  }
}

องค์ประกอบจะถูกซ่อนเมื่อเริ่มต้นฟังก์ชัน saveTodos องค์ประกอบจะปรากฏขึ้น แต่หลังจาก 3 วินาทีแม้ว่าตัวแปรจะกลับมาเป็นเท็จองค์ประกอบจะไม่ซ่อน ทำไม?

คำตอบ:


167

คุณควรใช้ * ngIf Directive

<div *ngIf="edited" class="alert alert-success box-msg" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>


export class AppComponent implements OnInit{

  (...)
  public edited = false;
  (...)
  saveTodos(): void {
   //show box msg
   this.edited = true;
   //wait 3 Seconds and hide
   setTimeout(function() {
       this.edited = false;
       console.log(this.edited);
   }.bind(this), 3000);
  }
}

อัปเดต: คุณไม่มีการอ้างอิงถึงขอบเขตด้านนอกเมื่อคุณอยู่ในการโทรกลับหมดเวลา

ดังนั้นเพิ่ม. ผูก (นี้) เช่นฉันเพิ่มด้านบน

ถาม: แก้ไขเป็นตัวแปรส่วนกลาง อะไรคือแนวทางของคุณภายใน * ngFor-loop - Blauhirn

ตอบ: ฉันจะเพิ่มการแก้ไขเป็นคุณสมบัติให้กับวัตถุที่ทำซ้ำ

<div *ngFor="let obj of listOfObjects" *ngIf="obj.edited" class="alert alert-success box-msg" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>


export class AppComponent implements OnInit{
   
  public listOfObjects = [
    {
       name : 'obj - 1',
       edit : false
    },
    {
       name : 'obj - 2',
       edit : false
    },
    {
       name : 'obj - 2',
       edit : false
    } 
  ];
  saveTodos(): void {
   //show box msg
   this.edited = true;
   //wait 3 Seconds and hide
   setTimeout(function() {
       this.edited = false;
       console.log(this.edited);
   }.bind(this), 3000);
  }
}

editedเป็นตัวแปรทั่วโลก สิ่งที่จะเป็นวิธีการของคุณภายใน*ngFor-loop?
phil294

การแก้ไขจะไม่เป็นตัวแปรทั่วโลก แต่เป็นขององค์ประกอบ ฉันจะเพิ่มคำตอบข้างต้น
inoabrian

วิธีการเข้าถึงตัวจับเวลาทั่วโลกจากการให้บริการ?
Kumaresan Perumal

1
ngif ทำให้ส่วนประกอบของวัสดุเชิงมุมบางส่วนล้มเหลวในการเริ่มต้นและทำงานอย่างถูกต้องเช่น mat-paginator ฉันคิดว่าการใช้ [hidden] เป็นทางเลือกที่ดีกว่าสำหรับบางกรณี
AmirHossein Rezaei

186

มีสองตัวเลือกขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ:

  1. คุณสามารถใช้คำสั่งที่ซ่อนอยู่เพื่อแสดงหรือซ่อนองค์ประกอบ

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
  2. คุณสามารถใช้คำสั่งควบคุม ngIf เพื่อเพิ่มหรือลบองค์ประกอบ สิ่งนี้แตกต่างจากคำสั่งที่ซ่อนอยู่เพราะมันไม่ได้แสดง / ซ่อนองค์ประกอบ แต่มันเพิ่ม / ลบออกจาก DOM คุณสามารถหลวมข้อมูลที่ไม่ได้บันทึกขององค์ประกอบ อาจเป็นตัวเลือกที่ดีกว่าสำหรับองค์ประกอบการแก้ไขที่ถูกยกเลิก

    <div *ngIf="edited" class="alert alert-success box-msg" role="alert"> 
      <strong>List Saved!</strong> Your changes has been saved.
    </div>

สำหรับคุณที่มีปัญหาการเปลี่ยนแปลงหลังจาก 3 วินาทีอาจเป็นเพราะความไม่เข้ากันกับ setTimeout คุณรวมไลบรารี angular2-polyfills.js ในหน้าของคุณหรือไม่?


5
[hidden]="edited"ดูเหมือนจะไม่มีผลกระทบใด ๆ ... ?
phil294

5
ในกรณีที่คุณมีปัญหาซ่อนอยู่โปรดทำตามคำตอบของstackoverflow.com/a/35578093/873282 : [hidden] { display: none !important;}ใน css ทั่วโลกของคุณ
koppor

30

เมื่อคุณไม่ต้องการลบ Html Dom-Element ให้ใช้ * ngIf

มิฉะนั้นให้ใช้สิ่งนี้:

<div [style.visibility]="(numberOfUnreadAlerts == 0) ? 'hidden' : 'visible' ">
   COUNTER: {{numberOfUnreadAlerts}} 
</div>

14

เพื่อให้องค์ประกอบลูกแสดงว่าฉันใช้อยู่ *ngif="selectedState == 1"

แทนที่จะว่าฉันใช้ [hidden]="selectedState!=1"

มันใช้งานได้สำหรับฉัน .. การโหลดองค์ประกอบของเด็กอย่างถูกต้องและหลังจากซ่อนและยกเลิกการซ่อนองค์ประกอบของเด็กไม่ได้ไม่ได้กำหนดหลังจากใช้นี้


6

นี่เป็นกรณีการใช้งานที่ดีสำหรับคำสั่ง สิ่งนี้มีประโยชน์อย่างน่าประหลาดใจ

@Directive({selector: '[removeAfter]'}) export class RemoveAfter {
  constructor(readonly element: ElementRef<HTMLElement>) { }

  /**
   * Removes the attributed element after the specified number of milliseconds. 
   * Defaults to (1000)
   */
  @Input() removeAfter = 1000;


  ngOnInit() {
    setTimeout(() => {
      this.element.nativeElement.remove();
    }, this.removeAfter);
  }
}

ฉันชอบความคิด แต่จะลบองค์ประกอบทั้งหมด ฉันเปลี่ยนไปซ่อนเพื่อให้คุณสามารถใช้การได้ แต่ที่ไม่ได้ซ่อนองค์ประกอบสันนิษฐานว่าเกิดจากการเป็นngIf trueมีวิธีการตั้งค่าตัวแปรของผู้ปกครองที่ควบคุมสิ่งนี้falseหรือไม่?
คราว

คุณไม่สามารถเพิ่มคลาสที่ซ่อนอยู่หรือบางสิ่งแทนการโทรออกได้ใช่ไหม เทคนิคนี้ค่อนข้างธรรมดา
Aluan Haddad

ฉันคิดว่าปัญหาเป็นngIfสิ่งที่มากกว่าสำหรับองค์ประกอบที่อยู่ใน DOM หรือไม่ สิ่งที่ฉันต้องการคือ: <div [hidden]="messages" [removeAfter]=3000>...ที่ฉันแสดง / ซ่อนข้อความหากมีและลบข้อความหลังจาก 3 วินาทีเพื่อให้ผู้ใช้ไม่ต้องปิดกล่อง ฉันได้เพิ่มคำสั่งของคุณด้านบนและเปลี่ยนเป็นทำhide()แต่จะไม่ถูกเรียกเมื่อข้อความปรากฏขึ้น ฉันจะทำให้มันถูกเรียกใช้ในเหตุการณ์ได้อย่างไร @Output()และEventEmitter ?
คราว

4

เราสามารถทำได้โดยใช้ข้อมูลโค้ดด้านล่าง ..

รหัสเชิงมุม:

 export class AppComponent {  
    toggleShowHide: string = "visible";  
 }

เทมเพลต HTML:

  Enter text to hide or show item in bellow: 
  <input type="text" [(ngModel)]="toggleShowHide">
  <br>
  Toggle Show/hide:
  <div [style.visibility]="toggleShowHide">   
     Final Release Angular 2!
  </div>

3

ขึ้นอยู่กับความต้องการของคุณ*ngIfหรือ[ngClass]="{hide_element: item.hidden}"ที่คลาส CSS hide_elementอยู่{ display: none; }

*ngIfอาจทำให้เกิดปัญหาหากคุณกำลังเปลี่ยนตัวแปรสถานะ*ngIfกำลังลบในกรณีเหล่านั้นdisplay: none;จำเป็นต้องใช้ CSS


0

แก้ปัญหา @inoabrian ข้างต้นทำงานให้ฉัน ฉันพบสถานการณ์ที่ฉันจะรีเฟรชหน้าและองค์ประกอบที่ซ่อนของฉันจะปรากฏขึ้นอีกครั้งบนหน้าของฉัน นี่คือสิ่งที่ฉันทำเพื่อแก้ไข

export class FooterComponent implements OnInit {
public showJoinTodayBtn: boolean = null;

ngOnInit() {
      if (condition is true) {
        this.showJoinTodayBtn = true;
      } else {
        this.showJoinTodayBtn = false;
      }
}

0

เพียงเพิ่มการผูก (อันนี้)ในฟังก์ชั่น setTimeout ของคุณมันจะเริ่มทำงาน

setTimeout(function() {
       this.edited = false;
       console.log(this.edited);
   }.bind(this), 3000);

และในการเปลี่ยนแปลง HTML

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>

ถึง

<div *ngIf="edited" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.